From d5735d6f3445d1e32a54255492ec5fe1304ef1b4 Mon Sep 17 00:00:00 2001 From: MarcPartensky Date: Sat, 16 Mar 2019 15:44:44 +0100 Subject: [PATCH] changed few things --- .DS_Store | Bin 6148 -> 8196 bytes Email/Email Account Maker tuto.py | 38 +- Email/Email.py | 39 + Info/dm.py | 308 + Teletype/.DS_Store | Bin 6148 -> 6148 bytes Teletype/Polynome.py | 110 +- Teletype/maths/mymaths.py | 94 + .../__pycache__/infinity.cpython-36.pyc | Bin 0 -> 2783 bytes .../mymaths/__pycache__/limit.cpython-36.pyc | Bin 0 -> 491 bytes Teletype/mymaths/fraction.py | 69 + Teletype/mymaths/infinity.py | 75 + Teletype/mymaths/limit.py | 16 + Teletype/mymaths/variable.py | 24 + Teletype/venv/.Python | 1 + Teletype/venv/bin/activate | 78 + Teletype/venv/bin/activate.csh | 42 + Teletype/venv/bin/activate.fish | 76 + Teletype/venv/bin/activate.ps1 | 150 + Teletype/venv/bin/activate_this.py | 36 + Teletype/venv/bin/easy_install | 11 + Teletype/venv/bin/easy_install-3.7 | 11 + Teletype/venv/bin/pip | 11 + Teletype/venv/bin/pip3 | 11 + Teletype/venv/bin/pip3.7 | 11 + Teletype/venv/bin/python | 1 + Teletype/venv/bin/python-config | 78 + Teletype/venv/bin/python3 | 1 + Teletype/venv/bin/python3.7 | Bin 0 -> 8632 bytes Teletype/venv/bin/wheel | 11 + Teletype/venv/include/python3.7m | 1 + Teletype/venv/lib/python3.7/__future__.py | 1 + .../__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4179 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1303 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 28996 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7509 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6505 bytes .../__pycache__/base64.cpython-37.pyc | Bin 0 -> 17106 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2745 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 0 -> 33952 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7148 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4291 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 0 -> 23794 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3384 bytes .../__pycache__/functools.cpython-37.pyc | Bin 0 -> 23861 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3802 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6582 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14409 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6160 bytes .../python3.7/__pycache__/imp.cpython-37.pyc | Bin 0 -> 9753 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 0 -> 3463 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1856 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3836 bytes .../__pycache__/locale.cpython-37.pyc | Bin 0 -> 34602 bytes .../__pycache__/operator.cpython-37.pyc | Bin 0 -> 13947 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 0 -> 29747 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10450 bytes .../__pycache__/random.cpython-37.pyc | Bin 0 -> 19403 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 0 -> 13851 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5397 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30592 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 0 -> 22143 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15250 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6338 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21404 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3927 bytes .../__pycache__/struct.cpython-37.pyc | Bin 0 -> 381 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61832 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22192 bytes .../__pycache__/token.cpython-37.pyc | Bin 0 -> 3646 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17777 bytes .../__pycache__/types.cpython-37.pyc | Bin 0 -> 9021 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13813 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19157 bytes Teletype/venv/lib/python3.7/_bootlocale.py | 1 + .../venv/lib/python3.7/_collections_abc.py | 1 + Teletype/venv/lib/python3.7/_dummy_thread.py | 1 + Teletype/venv/lib/python3.7/_weakrefset.py | 1 + Teletype/venv/lib/python3.7/abc.py | 1 + Teletype/venv/lib/python3.7/base64.py | 1 + Teletype/venv/lib/python3.7/bisect.py | 1 + Teletype/venv/lib/python3.7/codecs.py | 1 + Teletype/venv/lib/python3.7/collections | 1 + .../venv/lib/python3.7/config-3.7m-darwin | 1 + Teletype/venv/lib/python3.7/copy.py | 1 + Teletype/venv/lib/python3.7/copyreg.py | 1 + .../venv/lib/python3.7/distutils/__init__.py | 116 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2822 bytes .../lib/python3.7/distutils/distutils.cfg | 6 + Teletype/venv/lib/python3.7/encodings | 1 + Teletype/venv/lib/python3.7/enum.py | 1 + Teletype/venv/lib/python3.7/fnmatch.py | 1 + Teletype/venv/lib/python3.7/functools.py | 1 + Teletype/venv/lib/python3.7/genericpath.py | 1 + Teletype/venv/lib/python3.7/hashlib.py | 1 + Teletype/venv/lib/python3.7/heapq.py | 1 + Teletype/venv/lib/python3.7/hmac.py | 1 + Teletype/venv/lib/python3.7/imp.py | 1 + Teletype/venv/lib/python3.7/importlib | 1 + Teletype/venv/lib/python3.7/io.py | 1 + Teletype/venv/lib/python3.7/keyword.py | 1 + Teletype/venv/lib/python3.7/lib-dynload | 1 + Teletype/venv/lib/python3.7/linecache.py | 1 + Teletype/venv/lib/python3.7/locale.py | 1 + .../lib/python3.7/no-global-site-packages.txt | 0 Teletype/venv/lib/python3.7/ntpath.py | 1 + Teletype/venv/lib/python3.7/operator.py | 1 + Teletype/venv/lib/python3.7/orig-prefix.txt | 1 + Teletype/venv/lib/python3.7/os.py | 1 + Teletype/venv/lib/python3.7/posixpath.py | 1 + Teletype/venv/lib/python3.7/random.py | 1 + Teletype/venv/lib/python3.7/re.py | 1 + Teletype/venv/lib/python3.7/readline.so | 1 + Teletype/venv/lib/python3.7/reprlib.py | 1 + Teletype/venv/lib/python3.7/rlcompleter.py | 1 + Teletype/venv/lib/python3.7/shutil.py | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 333 bytes .../python3.7/site-packages/easy_install.py | 5 + .../pip-19.0.3.dist-info/INSTALLER | 1 + .../pip-19.0.3.dist-info/LICENSE.txt | 20 + .../pip-19.0.3.dist-info/METADATA | 75 + .../site-packages/pip-19.0.3.dist-info/RECORD | 620 ++ .../site-packages/pip-19.0.3.dist-info/WHEEL | 6 + .../pip-19.0.3.dist-info/entry_points.txt | 5 + .../pip-19.0.3.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 458 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7463 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 7058 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9843 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 21179 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11750 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 25260 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4437 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 8169 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3186 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 9104 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25937 bytes .../site-packages/pip/_internal/build_env.py | 215 + .../site-packages/pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 281 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5094 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 7822 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 16897 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2367 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8945 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 410 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 341 + .../pip/_internal/cli/cmdoptions.py | 809 ++ .../pip/_internal/cli/main_parser.py | 104 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2509 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1334 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3083 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6435 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4722 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2879 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2073 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1249 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 12466 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8715 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4315 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5896 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2705 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5008 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 176 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 566 ++ .../pip/_internal/commands/list.py | 301 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 186 + .../pip/_internal/configuration.py | 387 + .../site-packages/pip/_internal/download.py | 971 ++ .../site-packages/pip/_internal/exceptions.py | 274 + .../site-packages/pip/_internal/index.py | 990 ++ .../site-packages/pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 269 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1318 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2272 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1173 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 5007 bytes .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3635 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5620 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10281 bytes .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 413 + .../site-packages/pip/_internal/pep425tags.py | 381 + .../site-packages/pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 77 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1702 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 7622 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 9200 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 25037 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 6037 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 3151 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 16994 bytes .../pip/_internal/req/constructors.py | 339 + .../pip/_internal/req/req_file.py | 382 + .../pip/_internal/req/req_install.py | 1021 ++ .../pip/_internal/req/req_set.py | 197 + .../pip/_internal/req/req_tracker.py | 88 + .../pip/_internal/req/req_uninstall.py | 596 ++ .../site-packages/pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 8047 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6148 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2574 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1277 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 669 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1688 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3607 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 7834 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 25739 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1949 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 4085 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2621 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 395 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 4922 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1344 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 12306 bytes .../pip/_internal/utils/appdirs.py | 270 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 90 + .../pip/_internal/utils/encoding.py | 39 + .../pip/_internal/utils/filesystem.py | 30 + .../pip/_internal/utils/glibc.py | 93 + .../pip/_internal/utils/hashes.py | 115 + .../pip/_internal/utils/logging.py | 318 + .../site-packages/pip/_internal/utils/misc.py | 1040 +++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 164 + .../pip/_internal/utils/packaging.py | 85 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 441 + .../pip/_internal/vcs/__init__.py | 534 ++ .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 15391 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3808 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9450 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3781 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 5993 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 114 + .../site-packages/pip/_internal/vcs/git.py | 369 + .../pip/_internal/vcs/mercurial.py | 103 + .../pip/_internal/vcs/subversion.py | 200 + .../site-packages/pip/_internal/wheel.py | 1095 +++ .../site-packages/pip/_vendor/__init__.py | 111 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2888 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20617 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36150 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66460 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 220615 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8098 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26422 bytes .../site-packages/pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 558 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1561 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3044 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1774 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 765 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7644 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2162 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4682 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4246 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 666 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-37.pyc | Bin 0 -> 302 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3236 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1558 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 | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 265 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 268 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 526 bytes .../pip/_vendor/certifi/cacert.pem | 4512 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 20 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 852 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27187 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1128 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6314 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2235 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3445 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2892 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 363 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1135 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7074 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2421 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12071 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27191 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19115 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1144 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2978 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22143 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38022 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23636 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29092 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23594 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22223 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23625 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22202 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22225 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2935 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2240 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15686 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2993 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2447 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5837 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1978 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 447 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2693 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../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 | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../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/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../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-37.pyc | Bin 0 -> 452 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3350 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7606 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1671 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3865 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4613 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../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-37.pyc | Bin 0 -> 1050 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32060 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42581 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17346 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38732 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10298 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4484 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27694 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10894 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 11084 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47962 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20434 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25370 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 492 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1089 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21405 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15870 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62735 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../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 | 1295 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1094 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 417 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 ++ .../site-packages/pip/_vendor/distro.py | 1197 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1321 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13768 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22659 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41560 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3313 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66225 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97822 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10838 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 434 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2036 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2239 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1325 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 859 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1879 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2643 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2770 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16445 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1363 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 948 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1545 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1495 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3329 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11252 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9282 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11861 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11801 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4006 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 7002 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1731 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3538 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6647 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1905 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3073 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 626 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9069 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21440 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1806 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 220 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 176100 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9916 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 0 -> 2297 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 0 -> 4859 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 0 -> 3758 bytes .../symlinklockfile.cpython-37.pyc | Bin 0 -> 2182 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2078 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 227 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 24555 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 740 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 578 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8873 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3991 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19768 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1456 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11960 bytes .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 ++ .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 291 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5634 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 2769 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4817 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2923 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1027 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4211 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 5492 bytes .../pip/_vendor/pep517/_in_process.py | 207 + .../site-packages/pip/_vendor/pep517/build.py | 108 + .../site-packages/pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 3171 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 96828 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 651 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3919 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2741 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1583 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 0 -> 3025 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1500 bytes .../site-packages/pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../site-packages/pip/_vendor/pyparsing.py | 6452 +++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 385 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 948 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10065 bytes .../pytoml/__pycache__/test.cpython-37.pyc | Bin 0 -> 1248 bytes .../pytoml/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2147 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3582 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3496 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 559 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1317 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16894 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6500 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8351 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 642 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18796 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5514 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2695 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 24117 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 519 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19437 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4175 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4388 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22048 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 | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 ++ .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 952 ++ .../pip/_vendor/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2124 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10688 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10157 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 23662 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10409 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 5877 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2769 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12729 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5591 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 18756 bytes .../pip/_vendor/urllib3/_collections.py | 329 + .../pip/_vendor/urllib3/connection.py | 391 + .../pip/_vendor/urllib3/connectionpool.py | 896 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1104 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8323 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3250 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14486 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 17905 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 4914 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10320 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7501 bytes .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 289 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1313 bytes .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 563 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3322 bytes .../ssl_match_hostname/_implementation.py | 156 + .../pip/_vendor/urllib3/poolmanager.py | 450 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 705 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1000 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3175 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1049 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3230 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1978 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12664 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9556 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8779 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 5189 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3141 bytes .../pip/_vendor/urllib3/util/connection.py | 134 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 87 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 381 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9684 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4098 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5061 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2673 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 + .../site-packages/pkg_resources/__init__.py | 3236 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 98573 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 646 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20697 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203052 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 745 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 583 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2887 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8895 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19813 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 514 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10580 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2428 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-40.8.0.dist-info/INSTALLER | 1 + .../setuptools-40.8.0.dist-info/LICENSE | 19 + .../setuptools-40.8.0.dist-info/METADATA | 73 + .../setuptools-40.8.0.dist-info/RECORD | 186 + .../setuptools-40.8.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-40.8.0.dist-info/top_level.txt | 3 + .../setuptools-40.8.0.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7710 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 564 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5145 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 7772 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 17707 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 871 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5280 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 42224 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1556 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3766 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 870 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2449 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4650 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 34447 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3628 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32721 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7218 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1213 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1436 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15552 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1518 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6808 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1512 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 6997 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1027 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203049 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24407 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 742 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 580 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2884 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8889 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3891 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19810 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 511 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10577 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 231 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 752 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2420 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14208 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1799 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 990 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2469 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9723 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8599 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6480 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1395 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64851 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21697 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2428 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4104 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2307 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4640 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 797 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2546 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 941 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6799 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4539 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8134 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 5205 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6150 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2342 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 221 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 270 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 656 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1285 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2429 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1301 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 57 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 211 + .../setuptools/windows_support.py | 29 + .../wheel-0.33.1.dist-info/INSTALLER | 1 + .../wheel-0.33.1.dist-info/LICENSE.txt | 22 + .../wheel-0.33.1.dist-info/METADATA | 60 + .../wheel-0.33.1.dist-info/RECORD | 32 + .../wheel-0.33.1.dist-info/WHEEL | 6 + .../wheel-0.33.1.dist-info/entry_points.txt | 6 + .../wheel-0.33.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/wheel/__init__.py | 2 + .../python3.7/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 603 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 10094 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3786 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4721 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1581 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1326 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5425 bytes .../site-packages/wheel/bdist_wheel.py | 372 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3052 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6221 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2510 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 955 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.7/site-packages/wheel/cli/pack.py | 58 + .../site-packages/wheel/cli/unpack.py | 25 + .../python3.7/site-packages/wheel/metadata.py | 141 + .../site-packages/wheel/pep425tags.py | 185 + .../python3.7/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.7/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 168 + Teletype/venv/lib/python3.7/site.py | 833 ++ Teletype/venv/lib/python3.7/sre_compile.py | 1 + Teletype/venv/lib/python3.7/sre_constants.py | 1 + Teletype/venv/lib/python3.7/sre_parse.py | 1 + Teletype/venv/lib/python3.7/stat.py | 1 + Teletype/venv/lib/python3.7/struct.py | 1 + Teletype/venv/lib/python3.7/tarfile.py | 1 + Teletype/venv/lib/python3.7/tempfile.py | 1 + Teletype/venv/lib/python3.7/token.py | 1 + Teletype/venv/lib/python3.7/tokenize.py | 1 + Teletype/venv/lib/python3.7/types.py | 1 + Teletype/venv/lib/python3.7/warnings.py | 1 + Teletype/venv/lib/python3.7/weakref.py | 1 + Text/__pycache__/classes.cpython-36.pyc | Bin 0 -> 8237 bytes Text/converter.py | 157 +- .../class en python.py | 0 963 files changed, 145344 insertions(+), 41 deletions(-) create mode 100644 Email/Email.py create mode 100644 Info/dm.py create mode 100644 Teletype/maths/mymaths.py create mode 100644 Teletype/mymaths/__pycache__/infinity.cpython-36.pyc create mode 100644 Teletype/mymaths/__pycache__/limit.cpython-36.pyc create mode 100644 Teletype/mymaths/fraction.py create mode 100644 Teletype/mymaths/infinity.py create mode 100644 Teletype/mymaths/limit.py create mode 100644 Teletype/mymaths/variable.py create mode 120000 Teletype/venv/.Python create mode 100644 Teletype/venv/bin/activate create mode 100644 Teletype/venv/bin/activate.csh create mode 100644 Teletype/venv/bin/activate.fish create mode 100644 Teletype/venv/bin/activate.ps1 create mode 100644 Teletype/venv/bin/activate_this.py create mode 100755 Teletype/venv/bin/easy_install create mode 100755 Teletype/venv/bin/easy_install-3.7 create mode 100755 Teletype/venv/bin/pip create mode 100755 Teletype/venv/bin/pip3 create mode 100755 Teletype/venv/bin/pip3.7 create mode 120000 Teletype/venv/bin/python create mode 100755 Teletype/venv/bin/python-config create mode 120000 Teletype/venv/bin/python3 create mode 100755 Teletype/venv/bin/python3.7 create mode 100755 Teletype/venv/bin/wheel create mode 120000 Teletype/venv/include/python3.7m create mode 120000 Teletype/venv/lib/python3.7/__future__.py create mode 100644 Teletype/venv/lib/python3.7/__pycache__/__future__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/imp.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/io.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/keyword.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/os.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/random.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/re.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/site.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/stat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/tarfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/token.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/types.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc create mode 120000 Teletype/venv/lib/python3.7/_bootlocale.py create mode 120000 Teletype/venv/lib/python3.7/_collections_abc.py create mode 120000 Teletype/venv/lib/python3.7/_dummy_thread.py create mode 120000 Teletype/venv/lib/python3.7/_weakrefset.py create mode 120000 Teletype/venv/lib/python3.7/abc.py create mode 120000 Teletype/venv/lib/python3.7/base64.py create mode 120000 Teletype/venv/lib/python3.7/bisect.py create mode 120000 Teletype/venv/lib/python3.7/codecs.py create mode 120000 Teletype/venv/lib/python3.7/collections create mode 120000 Teletype/venv/lib/python3.7/config-3.7m-darwin create mode 120000 Teletype/venv/lib/python3.7/copy.py create mode 120000 Teletype/venv/lib/python3.7/copyreg.py create mode 100644 Teletype/venv/lib/python3.7/distutils/__init__.py create mode 100644 Teletype/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/distutils/distutils.cfg create mode 120000 Teletype/venv/lib/python3.7/encodings create mode 120000 Teletype/venv/lib/python3.7/enum.py create mode 120000 Teletype/venv/lib/python3.7/fnmatch.py create mode 120000 Teletype/venv/lib/python3.7/functools.py create mode 120000 Teletype/venv/lib/python3.7/genericpath.py create mode 120000 Teletype/venv/lib/python3.7/hashlib.py create mode 120000 Teletype/venv/lib/python3.7/heapq.py create mode 120000 Teletype/venv/lib/python3.7/hmac.py create mode 120000 Teletype/venv/lib/python3.7/imp.py create mode 120000 Teletype/venv/lib/python3.7/importlib create mode 120000 Teletype/venv/lib/python3.7/io.py create mode 120000 Teletype/venv/lib/python3.7/keyword.py create mode 120000 Teletype/venv/lib/python3.7/lib-dynload create mode 120000 Teletype/venv/lib/python3.7/linecache.py create mode 120000 Teletype/venv/lib/python3.7/locale.py create mode 100644 Teletype/venv/lib/python3.7/no-global-site-packages.txt create mode 120000 Teletype/venv/lib/python3.7/ntpath.py create mode 120000 Teletype/venv/lib/python3.7/operator.py create mode 100644 Teletype/venv/lib/python3.7/orig-prefix.txt create mode 120000 Teletype/venv/lib/python3.7/os.py create mode 120000 Teletype/venv/lib/python3.7/posixpath.py create mode 120000 Teletype/venv/lib/python3.7/random.py create mode 120000 Teletype/venv/lib/python3.7/re.py create mode 120000 Teletype/venv/lib/python3.7/readline.so create mode 120000 Teletype/venv/lib/python3.7/reprlib.py create mode 120000 Teletype/venv/lib/python3.7/rlcompleter.py create mode 120000 Teletype/venv/lib/python3.7/shutil.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/easy_install.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/INSTALLER create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/LICENSE.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/METADATA create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/RECORD create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/WHEEL create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/entry_points.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/top_level.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/__main__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/build_env.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cache.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/configuration.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/download.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/index.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/locations.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/link.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/resolve.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_internal/wheel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distro.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/six.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/INSTALLER create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/LICENSE create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/METADATA create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/RECORD create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/WHEEL create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/dependency_links.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/entry_points.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/top_level.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/zip-safe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/archive_util.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/build_meta.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/cli-32.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/cli-64.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/cli.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/alias.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_py.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/develop.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/install.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/register.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/rotate.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/sdist.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/setopt.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/test.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/config.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/dep_util.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/depends.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/dist.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/extension.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/glibc.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/glob.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/gui-32.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/gui-64.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/gui.exe create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/launch.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/monkey.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/msvc.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/namespaces.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/package_index.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/pep425tags.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/py27compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/py31compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/py33compat.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/sandbox.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/script.tmpl create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/site-patch.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/ssl_support.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/version.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/wheel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/setuptools/windows_support.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/INSTALLER create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/METADATA create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/RECORD create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/WHEEL create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/top_level.txt create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__main__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/__init__.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/convert.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/pack.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/cli/unpack.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/metadata.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/pep425tags.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/pkginfo.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/util.py create mode 100644 Teletype/venv/lib/python3.7/site-packages/wheel/wheelfile.py create mode 100644 Teletype/venv/lib/python3.7/site.py create mode 120000 Teletype/venv/lib/python3.7/sre_compile.py create mode 120000 Teletype/venv/lib/python3.7/sre_constants.py create mode 120000 Teletype/venv/lib/python3.7/sre_parse.py create mode 120000 Teletype/venv/lib/python3.7/stat.py create mode 120000 Teletype/venv/lib/python3.7/struct.py create mode 120000 Teletype/venv/lib/python3.7/tarfile.py create mode 120000 Teletype/venv/lib/python3.7/tempfile.py create mode 120000 Teletype/venv/lib/python3.7/token.py create mode 120000 Teletype/venv/lib/python3.7/tokenize.py create mode 120000 Teletype/venv/lib/python3.7/types.py create mode 120000 Teletype/venv/lib/python3.7/warnings.py create mode 120000 Teletype/venv/lib/python3.7/weakref.py create mode 100644 Text/__pycache__/classes.cpython-36.pyc rename {Nouveau dossier contenant des éléments => Tutoriel de Programmation Orienté}/class en python.py (100%) diff --git a/.DS_Store b/.DS_Store index 7ba41513250f3efc97f1a8757a7f7a7b093142ee..7dd875caeb02495c4dfc9779cae51a199ac3e840 100644 GIT binary patch delta 497 zcmZoMXmOBWU|?W$DortDU;r^W7$CF&_ryZ6iF%5R5*q_{GjCSl_`|%Ior7ay0}G?X zWFD5*dQXNthBSu!r1Ii|q@4UD1_p+cNd-BX#U%y?*BP0ZSyxqp zS2eWtOvtUQs;;T6o5=tMjErE4fq@@N!>Cyd3=Av`P#=~B7v<&T=cR+f2`ui#P|T1& zc^XS$Itzm@Ln1>aLrzY*VQ_MOZUM{yusWz*ZoZ2PG=wlen(self.indent_historic): + self.addElementIndentHistoric(i) + if indentB`mF;Q%yo}wrV0|Nsi1A_nqLkU9$Lvc>JVQ_N(#Kh(GAPIJcT!u=9 zT!uts$=m`41VB@foA2V1l#`#tz`(!}_O$U-h0H-m1_lNURVf5jaWNDZWPsd~Td*;) qm~FCw2+L+}4sH%6Mvje%-AjHu~2NHo+1YW0|Nsi1B1Zkg^X!zn>R3eF>Yq(;OAgsP~E(c@jLTm Zei21ZMg|6k1dzhXCOpcUV?0: R,Q=listR[-2]/listR[-1] listR.append(R) @@ -177,8 +184,6 @@ class Polynomial: C[-1] = R[-1]/B[-1] R = R-B*C Q = Q+C - Q.correct() - R.correct() return [R,Q] #Ce que j'ai du faire pour trouver l'implementation... @@ -191,6 +196,94 @@ class Polynomial: #5=8*0+5 cas particulier de la division euclidienne + def __call__(self,x): + """Evaluate the polynomial given an x value.""" + sum=0 + for n,c in enumerate(self.coefficients): + sum+=c*x**n + return sum + + def getTrivialRoots(self): + """Return the list of trivial roots found.""" + l=[] + for e in range(-10,11,1): + if self(e)==0: + l.append(e) + return l + + def roots(self): + """Return the list of all the roots of the polynomial.""" + #print("Trivial Roots:",self.getTrivialRoots()) + B=deepcopy(A) + derivatives=[deepcopy(A)] + roots=[] + while B.degree()>1: + B.derivate() + derivatives.append(deepcopy(B)) + print(derivatives) + derivatives.reverse() + oldextrema=[] + for derivative in derivatives: + newextrema=[] + neglim=lim(derivative,-Infinity()) + poslim=lim(derivative,Infinity()) + if type(neglim)==Infinity: + neglim=~neglim + if type(poslim)==Infinity: + poslim=~poslim + extrema=[neglim]+oldextrema+[poslim] + for i in range(len(extrema)-1): + print("extrema:",extrema[i],extrema[i+1]) + print("derivatives:",derivative(extrema[i]),derivative(extrema[i+1])) + print("") + if derivative(extrema[i])*derivative(extrema[i+1])<=0: + newextrema.append(derivative.gradientDescent(extrema[i],extrema[i+1])) + print("newextrema:",newextrema) + print("") + print("") + oldextrema=newextrema[:] + return newextrema + + + + def gradientDescent(self,a,b,precision=10e-10): + """Return a int value x between a and b for which the polynomial canceled itself.""" + print("descent",self(a),self(b)) + if (self(a)>0 and self(b)>0) or (self(a)<0 and self(b)<0): + raise Exception("The polynomial cannot cancel itself within this interval.") + return None + if a>b: + c=a + a=b + b=c + x=(a+b)/2 + while abs(self(x))>precision: + print("descending:",x,self(x)) + if self(x)>0: + b=x + if self(x)<0: + a=x + x=(a+b)/2 + return x + + + def _floordiv__(self,other): + """Return a string of the decomposition in simple elements of the polynomial.""" + pass + + def show(self,zone=[-5,5],precision=0.1): + """Show the polynomial using matplotlib.""" + Grapher([self])() + """ + z,Z=zone + X=list([precision*x for x in range(int(z/precision),int(Z/precision))]) + Y=list([self(x) for x in X]) + plt.plot(X,Y,label="Polynomial") + plt.show() + + print("executed") + """ + if __name__ == "__main__": suite1 = [3,2,4,5,1] @@ -206,6 +299,9 @@ if __name__ == "__main__": print("A*B =",A*B) print("Derivative of A =",A.derivative()) print("A/B :",A/B) - print("Unit polynomial of C =",A.unit()) + print("Unit polynomial of C =",C.unit()) print("HCF (PGCD en francais) of A and B (written A^B) =",A^B) print("LCM (PPCM en francais) of A and B (written A|B) =",A|B) + #print(A.gradientDescent(-10,10)) + print(A.roots()) + A.show() diff --git a/Teletype/maths/mymaths.py b/Teletype/maths/mymaths.py new file mode 100644 index 0000000..484c1b5 --- /dev/null +++ b/Teletype/maths/mymaths.py @@ -0,0 +1,94 @@ +import math + +def mean(*args): + l=allout(args) + return sum([e for e in l])/len(l) + +def prod(*args): + l=allout(args) + r=1 + for e in l: + r*=e + return r + +def sum(*args): + l=allout(args) + r=0 + for e in l: + r+=e + return r + + +sign=lambda x:x>=0 + +def sign2(x): + if x>0: + return 1 + elif x<0: + return -1 + else: + return 0 + +def container(object): + if type(object)==str: + return False + try: + a=object[0] + return True + except: + return False + +""" +def sum(*args): + r=0 + for e in args: + if container(e): + for x in e: + r+=sum(x) + else: + r+=e + return r +""" + +def out(l): + if container(l): + r=[] + for e2 in l: + if container(e2): + r+=e2 + else: + r.append(e2) + return r + else: + return l + +def allout(l): + if container(l): + r=[] + for e2 in l: + if container(e2): + r+=allout(e2) + else: + r.append(e2) + return r + else: + return l + +def analyse(l): + r=[] + if container(l): + for e in l: + r.append(analyse(e)) + else: + r.append(type(l)) + return r + +bijection=lambda x,i1,i2:(i2[1]-i2[0])/(i1[1]-i1[0])*(x-i1[0])+i2[0] + +pi=PI=math.pi +e=E=euler=math.e + +if __name__=="__main__": + l1=[1,[3,1],[1,2,[2,1]],3] + l2=["12",["1","6"],"manger"] + print(analyse(l2)) diff --git a/Teletype/mymaths/__pycache__/infinity.cpython-36.pyc b/Teletype/mymaths/__pycache__/infinity.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbe19768c033e887a05de18c7192b69d0af3adf0 GIT binary patch literal 2783 zcmXr!<>d<5-x0Hjoq^#o0}^0nU|?`yU|=Y=U|?WKVMt+YVTfXIXGmd6VQyhaVQyxM zVoYU9VaaAHGD&4@W{6@=Wl3dCWo~9nWtL`WW@KbYVGU-`WJ_j*nhBzr7#J9wL1uC= zFfi0Gq%dZK)G+zI1gTlcpvicPv7!j12u%D6(GM+7Eh^T}&&e#yOf4!%EGkLOE6%Re z4=Bn{FG|cU)(@yG$;i*s4@xb_FU~B)z7WWO)SYM*3ZmK z%goCxsnjc|yv1RYlbD;7l4u9=VKK<&B31?lhGY;6hCxzb&v!5|Fr+d>F{Us?F{LPh zJXDbA;7kSu70AgT8ic`N%LNKs#u|orh7^Wi z22DmkO~zX+#hK}OnoPG?ic@paia?>qsih| z1akZ>p3uCM)RNSq+|0bx6o^-tZ*jU-B&QaXWaj5Vk|`)@!O|_L0D>f0P$)u*MfUjk z+|r!*crB2pc)s6{4^OMQNmaRO8J^Xpn5znF*h|n9%NK*eo85*3c1A-A75CSm;;e10<{o| zKd-H*by_Ak%8ec0}^0jU|?`yU|=YgU|?WKVMt-jVaR2SVq|1UVM<|cVTfW% zVF_l?WPJ(JqRDuR!!s`}GcU8GG8v>1BnYBG*coI<3IhW}2}2EIGh+#3HdB#E4VWDa z6JyF|DoUtfOkvDsEz(P2s%6Y$NnxpFgs4hk&SoicDPd}62xfqaux2w9MSw)O;bOrI zDGb33nrwbWj0_A6=?n}EFUma3oj?qRh88_X5CbG~2*d!19MojK#ZppPka~+bGq0ow z7N-^!>*wcWmSv_E6(kmwq~;Z8 zSLz28<);@V<`(M*RF-7q=jjKf7UUOamgE;z>KYjsTIz?S=A?pb(a){SO)SYM*3Zez z%`DL?sJz9TlbOp53LG&|a53^Qa)2=#6AL2`BO8d#RK&r+z~HCJd`keTTQ3tD%wYF| frNQn)BG?%i7;bUc=0) + +class Fraction: + def __new__(self,*args): + if len(args)==1: + self.find(args) + elif len(args)==2: + if args[1]==0: + if args[0]==0: + raise Exception("Undetermined") + if args[0]>0: + return Infinity() + if args[0]<0: + return -Infinity() + else: + return self.__init__(self,args[0],args[1]) + + def __init__(self,numerator,denominator): + self.numerator=numerator + self.denominator=denominator + self.simplify() + + def __le__(self,other): + if type(other): + return False + + def sign(self): + if sign(self.numerator)!=sign(self.denominator): + return 0 + else: + return 1 + + + def __mul__(self,other): + if type(other)==int: + self.numerator*=other + if type(other)==Fraction: + pass + + def __add__(self): + pass + + def find(self,value): + pass + + def simplify(self): + a=pgcd(self.numerator,self.denominator) + self.numerator//=a + self.denominator//=a + + + def __repr__(self): + if abs(self.denominator==1): + return str(sign(self))+str(self.numerator) + return str(self.numerator)+"/"+str(self.denominator) + +f=Fraction(-15,1) +print(f) +print(f.numerator,f.denominator) +#print(f) diff --git a/Teletype/mymaths/infinity.py b/Teletype/mymaths/infinity.py new file mode 100644 index 0000000..f6adeb4 --- /dev/null +++ b/Teletype/mymaths/infinity.py @@ -0,0 +1,75 @@ +# coding: utf-8 + +sign=lambda x:(x>=0) + +class Infinity: + def __init__(self,sign=1): + self.sign=sign + def __ge__(self,other): + if self.sign: return True + else: return False + def __gt__(self,other): + if self.sign: return True + else: return False + def __le__(self,other): + if self.sign: return False + else: return True + def __lt__(self,other): + if self.sign: return False + else: return True + def __pos__(self): + return self + def __neg__(self): + sign=(self.sign+1)%2 + return Infinity(sign) + def __abs__(self): + return Infinity() + def __add__(self,other): + return self + def __sub__(self,other): + return self + def __pow__(self,other): + if other==0: + return 1 + if other<0: + return 0 + if type(other)==Infinity: + if other>0: + return self + else: + return 0 + return self + def __mul__(self,other): + if other==0: + raise Exception("Undetermined") + return None + else: + if sign(other)!=sign(self): + return Infinity(0) + else: + return Infinity(1) + def __truediv__(self,other): + if type(other)==Infinity: + raise Exception("Undetermined") + return None + else: + if sign(other)!=sign(self): + return Infinity(0) + else: + return Infinity(1) + def __repr__(self): + if self.sign: + sign="+" + else: + sign="-" + #return (sign+"∞").encode("utf-8") + return sign+"oo" + def __invert__(self,value=10e10): + if self>0: return value + else: return -value + + +if __name__=="__main__": + inf=Infinity() + print(abs(inf)/inf) + #print(-inf*4*inf*(-inf)+inf**(-inf)) diff --git a/Teletype/mymaths/limit.py b/Teletype/mymaths/limit.py new file mode 100644 index 0000000..2ab846a --- /dev/null +++ b/Teletype/mymaths/limit.py @@ -0,0 +1,16 @@ +from mymaths.infinity import Infinity + +def lim(function,value): + if type(value)==int: + return function(value) + if type(value)==Infinity: + if value>=0: + value=10e10 + else: + value=-10e10 + if function(value)>10e5: + return Infinity() + elif function(value)<-10e5: + return -Infinity() + else: + return function(value) diff --git a/Teletype/mymaths/variable.py b/Teletype/mymaths/variable.py new file mode 100644 index 0000000..72859e6 --- /dev/null +++ b/Teletype/mymaths/variable.py @@ -0,0 +1,24 @@ +class Variable: + def __init__(self,name="Unknown",content=[None]): + self.name=name + self.content=content + def __add__(self,other): + if type(other)==int: + name=self.name+"+"+str(other) + content=self.content+Variable(other,[other]).content + return Variable(name,content) + if type(other)==Variable: + name=self.name+"+"+other.name + content=self.content+other.content + return Variable(name,content) + def __repr__(self): + return self.name + + + +x=Variable("x") +y=Variable("y") +z=Variable("z") +print(x+z+1*4*23+1) + +#print(1.__name__) diff --git a/Teletype/venv/.Python b/Teletype/venv/.Python new file mode 120000 index 0000000..a7e44c6 --- /dev/null +++ b/Teletype/venv/.Python @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/Python \ No newline at end of file diff --git a/Teletype/venv/bin/activate b/Teletype/venv/bin/activate new file mode 100644 index 0000000..52fac62 --- /dev/null +++ b/Teletype/venv/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "x" != x ] ; then + PS1="$PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/Teletype/venv/bin/activate.csh b/Teletype/venv/bin/activate.csh new file mode 100644 index 0000000..2ab291c --- /dev/null +++ b/Teletype/venv/bin/activate.csh @@ -0,0 +1,42 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = "$VIRTUAL_ENV:t:q" +endif + +# Could be in a non-interactive environment, +# in which case, $prompt is undefined and we wouldn't +# care about the prompt anyway. +if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" +if ( "$prompt:q" =~ *"$newline:q"* ) then + : +else + set prompt = "[$env_name:q] $prompt:q" +endif +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash diff --git a/Teletype/venv/bin/activate.fish b/Teletype/venv/bin/activate.fish new file mode 100644 index 0000000..fc44dc4 --- /dev/null +++ b/Teletype/venv/bin/activate.fish @@ -0,0 +1,76 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/Teletype/venv/bin/activate.ps1 b/Teletype/venv/bin/activate.ps1 new file mode 100644 index 0000000..563fd2f --- /dev/null +++ b/Teletype/venv/bin/activate.ps1 @@ -0,0 +1,150 @@ +# This file must be dot sourced from PoSh; you cannot run it +# directly. Do this: . ./activate.ps1 + +# FIXME: clean up unused vars. +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent +$script:DIR_NAME = split-path $BASE_DIR -Leaf + +function global:deactivate ( [switch] $NonDestructive ){ + + if ( test-path variable:_OLD_VIRTUAL_PATH ) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if ( test-path function:_old_virtual_prompt ) { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if ( !$NonDestructive ) { + # Self destruct! + remove-item function:deactivate + } +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { "" } + $function:_old_virtual_prompt = $function:prompt + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + write-host "($(split-path $env:VIRTUAL_ENV -leaf)) " -nonewline + & $function:_old_virtual_prompt + } +} + +# SIG # Begin signature block +# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf +# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG +# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp +# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy +# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw +# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp +# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV +# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0 +# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J +# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj +# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR +# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU +# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC +# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV +# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L +# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh +# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al +# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0 +# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG +# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB +# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj +# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va +# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95 +# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh +# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B +# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU +# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt +# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g +# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U +# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L +# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG +# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B +# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq +# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 +# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx +# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg +# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe +# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G +# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM +# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ +# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui +# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA +# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5 +# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT +# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH +# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx +# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa +# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT +# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN +# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/ +# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB +# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH +# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD +# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P +# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3 +# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s +# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50 +# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm +# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz +# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl +# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm +# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs +# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0 +# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg +# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM +# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w +# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB +# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz +# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh +# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud +# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC +# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL +# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1 +# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF +# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF +# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4 +# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ +# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0 +# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg +# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg +# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE +# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ +# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ +# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO +# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK +# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR +# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb +# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9 +# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb +# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL +# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud +# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1 +# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG +# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw== +# SIG # End signature block diff --git a/Teletype/venv/bin/activate_this.py b/Teletype/venv/bin/activate_this.py new file mode 100644 index 0000000..444d3fd --- /dev/null +++ b/Teletype/venv/bin/activate_this.py @@ -0,0 +1,36 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))" + ) +import os +import site +import sys + +old_os_path = os.environ.get("PATH", "") +os.environ["PATH"] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == "win32": + site_packages = os.path.join(base, "Lib", "site-packages") +else: + site_packages = os.path.join(base, "lib", "python%s" % sys.version[:3], "site-packages") +prev_sys_path = list(sys.path) + +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/Teletype/venv/bin/easy_install b/Teletype/venv/bin/easy_install new file mode 100755 index 0000000..5cd8014 --- /dev/null +++ b/Teletype/venv/bin/easy_install @@ -0,0 +1,11 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Teletype/venv/bin/easy_install-3.7 b/Teletype/venv/bin/easy_install-3.7 new file mode 100755 index 0000000..5cd8014 --- /dev/null +++ b/Teletype/venv/bin/easy_install-3.7 @@ -0,0 +1,11 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Teletype/venv/bin/pip b/Teletype/venv/bin/pip new file mode 100755 index 0000000..30bd51c --- /dev/null +++ b/Teletype/venv/bin/pip @@ -0,0 +1,11 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Teletype/venv/bin/pip3 b/Teletype/venv/bin/pip3 new file mode 100755 index 0000000..30bd51c --- /dev/null +++ b/Teletype/venv/bin/pip3 @@ -0,0 +1,11 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Teletype/venv/bin/pip3.7 b/Teletype/venv/bin/pip3.7 new file mode 100755 index 0000000..30bd51c --- /dev/null +++ b/Teletype/venv/bin/pip3.7 @@ -0,0 +1,11 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Teletype/venv/bin/python b/Teletype/venv/bin/python new file mode 120000 index 0000000..940bee3 --- /dev/null +++ b/Teletype/venv/bin/python @@ -0,0 +1 @@ +python3.7 \ No newline at end of file diff --git a/Teletype/venv/bin/python-config b/Teletype/venv/bin/python-config new file mode 100755 index 0000000..1558e32 --- /dev/null +++ b/Teletype/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/olivierpartensky/Programs/Python/Repository-2019/Teletype/venv/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/Teletype/venv/bin/python3 b/Teletype/venv/bin/python3 new file mode 120000 index 0000000..940bee3 --- /dev/null +++ b/Teletype/venv/bin/python3 @@ -0,0 +1 @@ +python3.7 \ No newline at end of file diff --git a/Teletype/venv/bin/python3.7 b/Teletype/venv/bin/python3.7 new file mode 100755 index 0000000000000000000000000000000000000000..8e1f2b49fe2438795c05cacff8e2a132f794f570 GIT binary patch literal 8632 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fbc9b85e4d9079aef35535f3d824ef6057f4510 GIT binary patch literal 1303 zcmZ?b<>g{vU|{&dY#hzW&cN^(#DQTB1_lNP1_p-WDh39I6ox2<6vh;$9L6X{FwGRj zl**XJynrQzc_CwwP6~GlYYJNnV-#ziS0z^}Qx+Q|LpVd82@69idp1{579#@)rgEe* zrm#0N6~(0Rq;NphbEWX6a6;IT40${e3@LmmTo8T=Q!s-jf7Jy?h1|@%%-qBrh2qkr z;?xp_{4|AVhk)%!fVeLKYLP-_ zUU5lkVu~WyOHdg5-C{1!%nM0o1aTM`7(g@=0|SFID9j}o7#K2xib^_N!tI4RO=8cnQ*@$$E>qxU%>bYg$fXdhspJ(vmcb_}u)I)LZQF z5C=pF#;2#2q@<=LmgbZ|gftm%@ucL(7pFq`D;bJ785kITW$K3(rxq3K=jUXWWu_K^ ze3hD4oL#9OP?Voul$cwrA5dA6k)Nj@lvg06+wREgT^f=c6k{2*jX4g8AA|=^A>x2 zd`f(_(7t4jwK~UnMtK3sbH7iV$Vn{PAn-Y tLb4z3h+7;sx!{t*4iq=Vpr~hI;$Y-p;$h@rWn$!Fg{vU|{&dY#eQo&cN^(#DQT+1_lNP1_p-W5*7xA6ox2<6vh;$9L8LxD5hNI zC}u_wpE-vmiY0|5g*AmOg*}BMg)@aKg*$~Og*SySg+E0gMKDDuML0zyMKnb$MLb0! zMKVPyMLI<$T{4O_MK+2pl|7XsMXs5#nK6nJ#7^aEW&rcJLA*?c1w0EOd|oJ@56b6< z@&%xLK@dM3qE-mRP8Ejmni-=+zY$`j z3?SW6$|*rI|5GHC1JS+Cm0KhG>-(^%RX3hA8z^^=1&so~qu= z7^M-do}!te)xr>^>CTX%ox<6|kiwbDl%mti9Hr&XkfNKy(!!9!0u|AAXGqaYVQpbZ zVNKO;W{%QH)mfmMs=APok-?oIML&hDg&~Cvs#edPA;lnty@er#JyoxnIZEH1A;mC- zqlF=bBUQhdIm#f_V1aI`22`(63Req53Kvwbp*us0aSC?}Lkf4QVKZ}-QL51b-BeDH zS}=winpvaF-5F9WQv_NVQUsu?EZiAVtWtzp7*d2%&6}B{EK@BP=%!jh?XXS} zZed6fPPJ@ijH(4gv$#MkcZL*~6zLX*6lt&; z&s5I^x~X0u888d1CWSeeLDRJ=%Q30Aq$n}DM8PSsI90(pC$YFVwOB#J(aE`3Qz0$C zNFg~tCnq(zBr`v+SVti-IXS;5B{MHwp(I}+z%@X@*wD~YkBcibFSA6UB(=DtSRt_} zRUtDE%!xcRPJdq-C}oia`sIvNxa3E2(>#mwIm}y#qSoUV|ij`Nn%n?>Mc&^ z{G$BQlFYo+TfC0Nm3hgYC8^VS!{h z5em72Qp-|{iZemBu?A;WrKW%^%_~XF%u6l0#o?TolLIz}%NZU3x0r)dOKx%bmV(^~ zVzc`u78GRWrQhO%3c~o@P)1m0YWXb=@6^g-FpJZ(BsCYp)%%I8WSERtez<@^l%F_=mPAw|d&(Fy$%St%Owum^ zt2fp&*GEnU@rg;vdIgoYIBaqfbCXgM?JPhQAjrW*N(>B`&OZ#2W&t}Nr{jwh85kID zvBoFo7v)=l)Ps#v#%7!|69Yprs76j<2xDMmNWmQ<5JQ>c6Vt&}G}uTLkddH31@TxJ z7#Khfa|hYz!N9;!!;r;L%T!@g!|1{gYf{Txp;yD?!Vs%e%TmK!!;;0A%~m7^qHCBX z8B!RsIf~3mn1UGs7z)M089=N;o^XZ~#$X0bCch9(=3DIX@wr9$@$t7f;^R{?lS|^` zZ}Iu%mw4tDMlq+d zq%fs0w=gs_MzN-{f!ZlxHhT(NFoPz05hpCACBs4uM1!z1DAYi~2la6gND%B~O~zX+ z#i==IU=D-;yPqRIJ|nR>BR)O?q?HNeG^Q#+SZ>#Y$tHtk7#J8pG|1gxo5aBJQvwQg zp%TU##uUb8reJWWYcly2=`k=cXfi`w3-WuBI!J)&7ISh=aS_PN5NCk%4cILL@$to_ zNy(tXG9y1fJ3c-Jkj!=BCES-{Ojo&&^LM%>l7_ z;^PZT6LX+4obmC+Ir$~U@$p3UYH)CJ#>XduO8)rx zbda+_F~`7EB@C|(^x*R3#I89gGMS6O4n~UIB7KlcK)wch144kD0}j}1kVB9nR0`QK z7%^I82r|nEL>Pkz6A%Fk*&>kTMW!Gw&gcR;3>;=4>mbnu;(}ubM1bVMF=U4?^Rc9G zgE|Qr=x0p(jAc27>j#x`Fit@{AK|#U?@;567BL}D~X9Sl;{D|NIt3%1K zpb{D$Je7Pk3=0@a7(p$?aE3ey7KReW5~eh!Y_1|TMg|a!WXR)+U?^b*_4S$#pO!RiOe*r3)1*r`QMkU|EWyNE7irhr@svK3To2ryPjAz})> zg3)C1^V8(QUCyAogg}V{b|uJe9tH*maEZgt#K^xImc)S~$KMIhILvpZ9jIJm_RE=ZDcQbBbCL=8$@ zf*cQyOZ+uINQowM5y(y8Ru8o1$6q%r133ny1r%*uj8$^z4kDp`06Bm_Y=LZ=2eT3! zTP)b)2~@-2iYG|Z3^X7F8b|^+(l}B$f*CY9!4ZHxzQB!dv>L$yTF`^40dQfTS(2Ko zfKtXIf&*MqmS?1b3eJqg(&CcT6g^OJF9a&?QI+Ay%AlqJ$eQ^0ji4X^Cjn;UBv6uH z1WE!BHP}-es5+>Dq&KiXv0GIHii&M;OBk_Of+d}S%m!&JmOzvlBCs-}nHgGMF#8p` zg4zHem72_u5GT5n*a>nIC=q~?8xKlygLoc2xpCqyCg83hkmf*{axKVSQ0#-#94iMi zN~!~S99%lMp|wgtMP&;^6iX^AB+WH5MzN)`rtpG>FTt%7cF-VZ3quq~Dko?t6Py;g zz#Rs@B9L|9I6{d@P-X_FMFDUiFJMSvT*&CjkizHzidCkn0<38=ttdYi+*(NljUQwb z<>%#>7AvH~MhXxOkZ_a)s)N*8K~16v9iTMKnh0ua;7CiLa6SSGKX8I&sgeMj1h3AJ zQY=^jw7UW-BfTIb-T3n4(kbBiqz+~T?j3Lz{lGg0)=0;@(z`k?k1IJ7_&e5DAieFjPVj0|Y4 zG#yYIjgbM~N@Hqfgf?PHZl(EE>0l2^>}@tpmLkwVND-(=0H>NFM^GqXuh-cU!Hutb zpkRSD&_o~&G>jktt3;{VL1h!DAT5>ymj>WYy%em-O<@L=I?Zg*f|tz?T&zP%Ur=I& zxDqt@p~(y>ZHO+1Ux1to%9)^Y7~Ha!M~gqKjW%wqr7@_0fOPCpT}7Z=23daqGbLLYg|414JZ8sC6amES>51($G4Rf6Cm2GU}K z$fCq5sEh~4D*gtWCn!}h7lGYLbj?S64fgHySvJw=}kkp0NDubsl68mhtIMWp<`4XG&dE(=Xz>_MeDe>`|Acukz z0#lVZVy;CGSq*vdslx1o zL>4G4!NmZG03}awQ2?p{kh^UZHK0K~ddvbGlq|qm0aQML+7O@yG-#%wDh_`UK~ifO zlK3<8^HAH6pq2~vQUjdnEJ0xePA4o?LWq`Qe0(0bJV8k!po$3W4^Rd`D(G+wQ(|#F z)Vm#VuM-Q27V0GeGGL9NJ)eHJOXR*`Mg*Fc#!cP*#GsXr&O&B%v`2b_=MCDMED+ zfyNTZv8Es=fRYKQgrss~7Gx}DSqLvfKm{;ln!^uy_7ObZ4%P-Cz#TdE`1qXEy!iNR zkaNL>6;l;2c+r3!R0gG-0)+)Q9pi7z`as$oV0RK7Y55>0!0IqA#wszGGf1euKo%2- z9FU{ZVOD`6hX==~BZ(~yeo*2Cw_w4+h&1v64ltxhaRY}xw79*+SOMlj2ymS6#K$M+ zgV$>m$H!NJoC-FPsY=WlBAf~u8AK={Cx-kWF$8ur(J@p9atl%nNg=z3gjfPuP9T;* z4l9FMhcA{uQyR#P4CIM>@XR1qwLX)*1Y)O(HOqQG!9SBL$U`G=jHPb-OKuXb)NKPRkL4)ijkf1^C>Vw$^ ziXvRaP7lVga}*0`@TY|#iWNK&&JYEk28RteLx!89I8(Vm>u13O&)lF@v@Hx#JgGcU zyr9*zEeuh7DZ-#NgHimc{80j+m9;GlQG%e=wJi)$LZB74Eeuh@slrhrpp~{Q3{j#f zvcU|Raz&ukG>K7+3=ED6#i=C2))WJ3vr{*T+m1HJEmi(nL?VYrlh82=B0wI zg4>#&8XvC%)>Q%;YzJAEUy_kpq>x_#TDJ#UT&Pfwn^=+wO8y{=b8_;_ z6^ctUOCWs;a2|mtdr&?DVQ~2b%DN>CHH;;U%}m97paoSW%ry+nj3vx9jLnSMEJaG7 zTv#Dd!{EXYD*&3`uVKt)FVX;s7HWhuKqj;O+(I;2ZgFK6XXX``B<3Zjf@2jtEqIGL zCpAx#8IpNf!Op+MlA4p63w9KQ0OwvdP$`BK_LweQ!oKa07ak`YKK6M#uxh_&%>P$ zD&mQaeI}y9w}^jJVqPVp6wJ&kC@q1OLZAgizNN(_$YoJxu>z!EQ^-sM z6*$lmG8tx9evv|PW_n&?Noi3kxL5%hl9HcVtdN&q0$Qbn3KS3w>{UYGJd7fZ5?-Ko6DUTD z)xayNkjteGh6T*+3~7v@?H(;0pyi^?ketly2X8`vYyoKpEhj66G`(VlY8h)7I~cOr zikNB`LCaSQnNSAfnQk%Z8Gy$nP=;GTKKaFI1M22h6cpLrg?WO7p-K+yiTK34l=yf( zo1FaQ#GGO~J-AX$7D)03^<^RD3TT}pMvjHq2C@jWY!z(WEs!-x>53c4DtJJFd=N=PgWRk9!t#K-3skrL66x(-~N(3Yc4=j*V;MoE+Qc%Ls!2qtVmB1{fW~O3^ z66RnAQ03Oau#mA6%tFd444^!kO@(QBvfrs5!kdHu3cNPXF zMp!;6E=|H7e8}}L;miWI4rCK3vw+R~0J06F5!6%wH5RxStDqSMERQb;p(TqFxV-=m z!VYNrpq3HDLJC4g+5{nDSuefmM4m~jr4hgSul`EF3Q0lRh%xQxkStYu7LtYH*kNMRCZ zsAVc)0=0B&nNyf+m_Z^U47DsZEHzBN47Ds3Cg2vYPAzK*a}8@VV=Y?^OAT8MTMCOE zgCj!K@WHQJW3$R=YXEsyOj1(@A zjlm3>+=<#u3=Gcsxdo*qso<&`v}zx=6gW*G5ma0w)%U}cFV3gxK^DfxNoB?|Bk z1W0FmycMKQ&&dJlgmgAQ5}*nh(kTGdG(yK~UNCmC#2RX7NBefFL#{+FO0*6p>VlJW;1L{$v=9LtKx>D(h zMJYL{#o!KKMt(U+aV2Df6|6%D?vv#qJW-U2tOwKt%P&d+^|K(&D45~a3dP`++(oJC zkS0@ZX>tZUB+`mfQ&aMD!Hp(}2SE$`VBw~xpb(y_kegVNoB?u>LSjyOeo zaVo+kNtIyPq|(fs65Y%^g|wpls?YgN z9AFG;07x+MfY}fc7RD-0aIpfi%1=`aZ6FF%sHfy7$Hy0e=5@f$@S<=~Cm|9lL{&X?OV&q}N6ejS(K4#E9Sm?q&R?t4zX2vM?6n4;l)+q2E ze53_B%EAjBW#LN^4Q9|3D-vd4U`T8SkDla0HrRpl?I0UP0gb1CX96Ij8Hp(=8k#!b zp_P=(;^f4l6b(&iVGu%t!Ii|E90gDj2X5?^0cU|tbuTMVp!hRqjjMc^QE0eJ%4Ib#A3 zNC_f&1fl}o`T+R>6yIQffYvycFo4?{jFmi~SpZON0^EcL^>`Q=YCzjXn5vART{uwXRFGd#0NW^}r=S2?)(P_)sIE-SEhwqf^V4L# z#R3|}yv352T2TUCh*VS#D*M15hW1mUK?2x(&0LUQ;05wBXi^I_yTHWA!^p?T1KO#F zoX`sL3*i0+B{B{M1_rRdK?CKLLKQrqr4yjz0}5HfK}#=1SQtteQ8vdgML@T3R+)iY z44K6W#h?*PjpU-##FErv1wVzn)N;r;NJ)NCv7)9zQfY}oYFZkow_278iq4{HkUv1a zgLSOI#X6V(mF>4!lXFrNi$Xvi0yR4sn3x!u7zG&l7^?)3;t{L}o*Y5Z2x^Oiy(7cG zz)&Fu?rHPYGJ!k=iJ(HZa0ci)EKSCuQc#W{6twK|@tL41DhA{laEfB&0=Wb^Ye1D? zcMHf{6;hDqwF^Tms(ZMQ-9uDVbHvAIf~(O)goF4%4iZKR8kidFE&>glfio*dkq{_s zKoOqj07~p7pzalD=#?3iacdbXw7_Ag1nQyJfJQ4^z#RrA(Eh1Hof?J(tk7`PLHL8M zs0I|hi1Au*69D8l;sPAxL2%ul2J#?i#FqiI&5H@Lg_nbohl!7|3eB@%_1HZN+WLy& zSqYTH!3gz)1i}+c5Kn+y4I5X%nfX8t26y^Es{)}N9u7t>CU7!Ab0}DypC&(Ald7ly z6lCD$6et~o0}5Q!6;*&F!1)Cns-P`!MRg#tdJxe7B0vcYy>$d?Yv_Q&4>UgyX&v#f z^00ESad2^PfLlqt*xN&(XhUufp-iI+g6EwWanCzJW}TwApmR>#DJ)Su;K^5^A`zHV z;n4)D2tkDqILCrYB5;ih?RqkTOFw8ye~URgwGz#Xx41#W>m{JgIq~tmAg_YV1MRAX z9!#KzB=46D3RY0d4@86P0$U2&kYC9G%9@f4!3-=6B@EeIMKX{Q9#odY%Q_nuz4X)) zjqGThlvqs#T{{Jr=75PQCh4N1keXARs*s|mppXLUoh6p$loW${Mt=Eupb`)2 z8E8?{2x{T7r=+HVl%e~IIX$&xBFHx&M}i7I4p82P9ku{+1xomVRDrz$8k(!*fp`VH zY93T{gS?{v@eXK|F#QfSiTqnj+9N_Y9D0z{M~lq*h^LsuDqj zF?71GI6fYwW&uS8*kK?SLTXg-Xu6e)UUq6_u?9F4!ChtDoXqT0h5V$f)Z`NA3?bLP>D&Di(9pA2b`efCY4%5@<#e!pa7gofZ%QO3Ov9AQs5h zqIM7q+)o8BbwyYVW`S)7xwa8xJE#)kU}E9oVc}xu;NV~ZL)3NephO4mP=aPQkqgii z@bM9lBd)+x_iUg;lA_q4dlNzBvnJy$j`&>2IV&iE4Kfs*i9p#8REfpI4)oAuEb2sr zT@*W1H(LG$4IP4}=i}pdfxH1Sj)4)Lc|qs3=*7oF6ktz)AbUZXH;b_uIuXkR9)*Bd zjx{5K7s>2JvQ8M9nxNK!`<5uSfr@0fFH;y7Fw`)BN5Gl&3@I zj*h6+00~3AtXNd5smXYYEiJz&H?agqA_t81r(LrK<0yrJkZJx4rW}7*Fnu~pdD3>q{8oj>Es zkiy`BIM@c353naiPX-2t^GFs7B3TIPY{kd>X<}akj~KfG7aJghz=4lMfCCW}D@Q;! zfWjXX=R7P_jB`+h0=5x*9DwXZiSwdfM45my&ToR83kp{TrYZ^eX-&8y9W*WvvIm?& zK?Ph5V+>O*Q!O)S@p2YJ4U;58ElW5<9;mqi>M3d=H#cfnYM8S*3ar31Q!u3PV)Ap- zWC9l;kR~20cqkLx`^|+U8&D7T7GoLM=MVxM)}WZU3vxVYSuLnf06O%54|M2(7?L-z zr6iDVK@}G`C4t5ZE95|F$%O$j2MJ==FiJ9{F@a|xIl>_hB`QsWQpPioqd?{}F!C@~ z2_ZX%I;jkl4z7YM0mTF~m2rYR18UKNG02CY*eM3(Z{(5%v-$y_TLfwlfP)sEvOw;K zm&BkcqY52RxPZ@hVgj+iQO#V#T*H{nQLF~0nTj|-?aD$>h=D44X1@?OSdN5l9|grF zBv$)D6)wnmV0*y}binP)k06hMiW5-iaWM)oaxhkjBaRLOmH&{{uEZuKm^D;;3xzY%*auQTsfqIkIDou>|;x1ZwBo#=SX7&R~3v=oS@?~ zTNt9aKu2h{Fhp^Kj?n}y{Yw!9cgPr{cvJX-88n58L}77((k~*^8AIy7fG3tA5efGp zs7F?u3hj~cFvE7qF;z)HM<$>R0nl1km@;_s14Sqy`=Jd*EL980>Xg(RP*XZSUI4Gv zaAk0>gW?*LvA{(fXuC74A63g7&XA`7?G{3J9@l{K0_cbxjVADLA87cmhS8RxhB+8E zFt*Y~uOPnwsk2xHn&|=$+!hz4CTFH)rlx>8G~hw?BFL#iprOL#{Gy`N;)47<@bQD- zwl`uDNkPFg4Xh~>GM$x{Uz(SqqmTj_9tWLFl$rwSkfvvrrRM1@irWzI-hC-ikhCG)NmKx?1 z)@G)no(hW^<^`+^A+-sr$}&)rtdM}162nx>Qp;My3N>X?I75X@4dVhfh)y)w4dD#n zBS6>_y%`x86kPO53sMqGQZ=GobrfQ?wA{c0BGB*-1xqQoK*AZ?(a{H0KA<%L3a;Ri z!wr#-L21=9O~F+Gw4^yT5412a1++LoAyEM~+5%Z@sG|T{LTCk2uK+sw6g+(8Y6Th2 zvQ==6&W?qrV2~mVLvs?7vx^BB3dwGufiZ;1WvIsHDWqnCS4Sr&7N_b!)+A&WE2QOv zRzs(zC?r){LENXKPzEx{4K^?XcPhfbDurfPk9Xc;&qypzEGa2Mj5}zu6@k)pQ2;30fY7N8siYPmA7u`qHlf#&I17$#$p5es1T-Yd z$50XMd0ELRAv=T1Bp!s5nvY~ z2$0*rEvWyX)*N(fh?|FnhlP!ahmV7YgM&jFUXY=*>_FQHkz01?iw(fT>kL>H8VG_1 z))|oo)_K6~IMBM;sxHuq98d!SX{$kgoosZWcvkd zYfEae0(j{Ue6s{-b8>lnJY-c2WP}K^9sp@j9kMC_v=tyPJ|0pSfm?(`w&`whdFG|0 zR)D8TD zFxE0wDu6l&(Dnkjn^(h_!eq`+%LwYcK>M$t;c^Q|!UqkKM?kuP%+Sq~peb%m#-f>^ zE;c0P-eSxw!q%$+^$GJq?gh7p7+DxW)0Z5KY>+8TK_u6Migct+2q33}Ft{ZO8epwZ z055Hm0MEaH`dv~rOf`(zOhss`hW$cNc3weR=h&PE>Y`MFoCXRZ(7HTucS{t>Nm$17 zLBS5HjKLua8sDr?0=3d0Yw|$H+JmPx!7B)%oh~6n7n=DN2kgj%TdYNidFhaKOwbrF znvI&l!0`iK@w5`tn6e-VK!%|WhrzCXDDHY zo>|0F^((@2B0DWtQ6E-1??h$wicj;0#s{oX+c4LQ3+@Y z2J9AaTcfxnzW`ASg7oJXfHrC+=IDUh#K@I*EjO_O zQd5F5(=Et3;b3QKvVjMK!0GoEE7<;9EFjAv=>%Jfp2fhx&m}!x z=9NHV3*2JEjGVku&_WhayyPb*mlhR)PCW;&Zv=-uyqE%IDv*ufMctr@$Qp)NDbR}e z4u))wVlnVO2&N*Y6v!wB6KI@8lL;Jxkn_zonIJ2?L1CiF2o5o%A``Saehw&9K-RD@ zR4Ky!4)y@H<;jek>gWgGyDFLW;`Uy67zgQjGWG%PMqT8^OL1(&g)!WMPT9+aP9>m|Uk2~S4gz<~_;dJD3^X z?}rBxLf!0^0FiJ5rgZ58B9jN^R zwSGYZ8k(TEf{4L;Dhf%J&~yoEi9lDo7DEO^Kn)p~UQnJ|isV1=v_7a#grrAsF`x+U z>Om~H4e}nyxuBhIn8^~Ns3;S3KLogVVqjnZc@V?~$0?}02U%qUi9uWND6l4D)y!bf zSe!;QxHy0|+&~8hgIjHoWSEx%Yruhq>_FoSV8sd=(7v=nPGWJ1CZsZfw#FdqMG+k( zP&+Os6V&)CRsfGUf_i8WQ!;f43u0!o<}NeAj@wRAZ=Jg6A9#S za0?0Ha9Bf@=yohL&=f$40#pm&DWt#)>p*wPfEMjBFtA`I1&BLQybDSRVDEwkW>@b!$m7V*&pm41OajxxT@a>aulcm z%)!LM2^!DfVdY@q;NW26VCCZAVAJ#lFH^k5oS2kc1d4sg@t#?r+{GRr4?fNV-0Hi< z0@?sm1RD8{;sdv;ARCOq_Y;Bm;I>ti5S$5@29J|P34qoH#b>8hf-`wZei3-FPLvQ> z7@S7n5}>6#QG#FzP@aN`NAZF(3BuSpplvZCU@>U%1yflBDjcKuz*z>aK1wJjKQA3s z3_Q0U#Z#PGf>6d&TvCMK@qs4^;QU+6Rhb1*JXM(maG@wpuuDM;(xSM*Ot5c?qqx8v zkPnKBK>hwG9_XNNK~a81WfUi9Ycu%vry|g$KT(|U`vt(qVikb~2BY}Fr`g6Ml!B^J z@Kq_0n?XR;5~wepo>^RyS_C-}9<=iga!4!}C}Dt(UxXYu2%2Iq0;TdI&;dMpSa zzo-(l$Pe5Yzr_kl4#nVvc#8!TRp4?9i2$Y3TO2l!>tyUePA@(Lx}u0lfRTfV1$@a5 z=u!yKm?#S)8#@ap4V@g!qN{ z1vI&sh4=-81q`^Dg#-kIxWEf~A#0FPNM->60ez5KAwCfzw0V6JE j0X`ug{vU|{&dY#gmG#=!6x#DQUE1_lNP1_p*=BL)VB6owSW9EM!RC`Lwx6sB~> zC?|5*cs$zJ_ZJc5{4SaX2u$Zc*YclU$t=rEEhN&aTuCD9TSSO3W?R52!53$j{RcN-fAQ&Me6V%!w%}noLD(3=9mn7|X%lh7cSe5zhGd)Vz|^qWE|bkn2EV42&F%9E?1S zRg#!)gsM$ufjSaoD%_C<2uHHiuz($@Q^S(QSj$?&3U?@Lu}%%k0_KGbj0~{oVgWn4 z2$V!`u@$A}=9i`35{OUE&&|y&i3jr&bBZ4v5VYA75CS zm;;e1;$&c8DB=YXpa4U%9qxo8P~d<(Qw$0n4mJ)J4mPkDN}d3P8aUgDF(Ty&yA-Ar z<`%{%<`k9`))od(7E56V=L(J#&K8C!wiK=u?iPk9_7t8J-WG-^jugHW{uYKP&J=+Z z!4`%nt`wmZ;TDD{?i7&}(H4d%o)obZ@fL*(NxhWu@tow^%jOG@f3{| z%@&3zi4?6A?G}b8$yCWGsT7?Q-4=!@=@h*b{T7BOnN*o5*%X5m!xn}pxfG)m;}(V} z`4p2B(-wv(g;a$o#T2s?^A?6Er4)-4%NB+xlTJ6l~k1|)fAf)+ZKi>wG_r+ z22J}SP$>Dqvp$Fi!r(071kU=+44{l(!c@c1%$UXqE>jq5nQEA77~+}JL2@i53}7{^ z&}?H@!?1v@h7pu$!0C?})A(Re$^n&zHH^&+Aj7~(S+9mEi=jxVh6$1D@_1^PvX~dJ zK=L5iI7UBBR!B+~j4w#dOUcYjhbQ4%Y>5RRv0E%Di6x1**i$l#lM{(NJ%V7)ntZP4ps+N0#4Ro0^|&E@&}dT z#h{WGl(Pib*_c2M;b5#1Kz9bbECWRv2!kU|16)jGfl4xlEXFLRTBZt-8b(ma)-Zw! zhGs@ahC+dGq~ZbWOt6!rL7ASpAin_W&|8c-MIbS>&?@3*U|=u-g%rrqu#l>ffIASa za6xe>D2IcxYOxJCg@IC5zZN4yg;EVe7NZM8tOTeCMoJh$HB4a)j0}ZB;S3;02QmaP zM8F--1kU;3aECdW9TeF`scA(rpwI^gEtmi~6;uR)ithM$E0F6!QNzH<#mEDSYi5)H z2AA1zcY`VocmRV6rV<8_YnvItG*dI91gwI%#hjCx2X;>pC|ETaArTIC0hj|!i6ve@L&Z6JE*M!b{{C)gWOldSHrM?5mbBDFk~?;U@l>)VXR@u zVr^!EmuQTBnrz^>1?K{ANEUH}k{ZZBaK48&2fzV~7N}sAfgm@6f(DXvs<>gUOiW2Z z2|kdCVCTs|^EA5iKn{hKi!5l4y2YBDlbVPl$cpqC7#PCP+`$WT2UsJDOW=tglx09I zB~Y0RX$>+KX)`b|;D{NPVQy7|#pf1v6MGL?pMNnzT;hkCu&NHy=q6~^_P=ugIEl7DB$g7|N0ur@M zj7*GtjC_m&paO;w5zz(t1t{qdlwiRTt%Tush`&MUuo+RSf~!GL`GS-NK{W;qx2onqi{0rzQ`YM2%4bLgc7*(@B|60 z5Mu<@1DVC8N%8S`!lek*_Gkgw3^I~|u}Tt_gb}tvy@O&oC8U-eS@-z*al_;({U70jTCC6tUo zmO)wru|lAhUI#-qTM<(YYDj_efhJRt1+1(^sa`;7u*i~ufnfs3FlZpD!vZN2)ZZ>n zO$H5ZU<)W{eFf>VgOfSLHfT!?WcV!}WJCI4wlE+yd5{&LgbXNDz-bIM&%=`dIDseT zrQl8Aw}g?+hbHC8NbZov=3A&b6z9N`Jgi%Q-h`k*@=dy&X{90f}`)oxv6#pHmVa zKOe~%@TwCch2jW!x*eeSSPXL~3qzGEJhK%SmlmWJ;g1n6P@qCo;foW{;M5|RB@9Rv zCqg?)fZ&f67D&qmDOQT?KxHQ=Md5M9Ew=dh^pg1aWk?P|iWQI)c1M85C_tT1a4(pt zSfGR{7}O(XE@3HQEn$Nu6()$I*l%%V7H8%amn7yTr-C~RxA^?>OFVN6AnmNw6hvAg z+SRFr@$oA`u7+XCfHh($OVNeI9Y<)QJ@|Iv^r*}VN7FkVF0x_ zQ7ax$6o4?e;sNzSYZzihKFd_uWZm!JYl+5C+{LH+P!$=N*cTNz} zpuUiLktoPeP{~jv4q}0ZC?P#-P&row8XPLp1WD+D2vC<1JbqFH>Oz4>35q~@6Eac? z>e3Z~(sGd*sBUDBj|aD&!7cG3P;>H&>m z6oZs=FmefSuyJs5FmteTuyC+)uyQbS@PKJH4i*j;7A6iR4o(gxFwF+0nV}>rvaFvb w>n#r0#2mOS0CHerPELG0WP}!EDg{vU|{&dY#einwg_m-5FBYQ#e`}QaDoCnwg{6D|J#hQ@CLTO%3YH_hbVor`iewspNNwEUDs}&N9 zQWf&cQj3Z*Q&Lj%^uT6>WTav$Ois*GNJ>>mPRz*xnOqDGgS<+R!60AelSfBudc-L729!$1Sk7-(gO#`U`VF#Gg zA>oZ8my(*MkXsoKQxOkQqEVchlcuAfr>BQz6v#L|J*Zzb8E=Wi$7dG9G(+^p$7?c1 zv8R>hCFdt)tz;+yC6Ql=`k}?CMaBC0IhkddsYL~eMJ1_u#o3km0Y&-gMTxn^`T>P@TaJN|h|2q$Fh((_Fh#Mn zGo&$sb23L1YdZrALlj#ugC^@OVVDizfQR@t(Tj+5j-(zIm%*92nK_9?pqvFW6=EPX zGf*7YNOt0la3pma$vMUNA{}gwI?TC98r4DhGbOd4C^Z?BdGr)Qi&GWUQ52MCmSmvn zhj>?A0hH}h6H}mRDjAeqKyd@2L6HQ)#bTg>ma&F0o}q-XnPCA_4dX&aMurq{N#hry z$y@{~i*B)kbI&b~`1s7c%#!$cO{QBcpoDyj1C;d=lX6lu8E5fq_990=B0w#WksopDZ2T2Ih6`96RZ^~^Gg*#zE8|4&W9>hNK^o; zEHBC|fwa+JX$Y=Qp%mPl0=1*mbMo`j)fLk6i*i9tE11ckHfT;_QDRAEejXW(Cy^{_L)lZWZcM$-}^N`9A%mQb7K?Vi}Pf)f86)_xAEKEfp zk(Z#FS(D=ye|l<3d~#xPMrwRXes*f!EzbDFq-1cldy5y$EJ{t!EG|hcx+MhWf?SiB zmz5>VEFH{n4I!sMdV#FA8n#5_=+2h_O%Gr*Z6DOCX$Y^f>Wcm^4h zl3A3RT#{3%qmY=F0_r*CDI_L?x-6i)mYZ3jo0+EocBGzyLL_oFgM@Hu5!|HGyrR?` zP#aDmIX^GCD77RNq7l?7Of5^zQ%EY!%qfAJmkR17=7D-kP;GF7Ks`u>#9{^Yvdp5A z(!?Buvy0Ugbag?FECzWI?A%OHm##QDH7_MGucTO^JTnK<9Rm3c)N#tsE6z+wElN#6 zG6j^yLAf601#qZ4IV&Vpg3N}y6YikQVpzawXexkuC!q2`MGI>TAZI#3NlW?zbGZONK+v%zXnQWtUyeGxf$IJAg?Fp*Q7pO1ImNeFKn>d{)}+MZ)Z!>k5U02x zF*)@XTXuP3QF`$$=H#4WSmOavl*lqLFw}yI5|EP^7{wSl7_0c98CVZ$4@R>eKB!Q_ z0CI9O6Ucd0)j`l=MIliEJz;?o1T@P)3R6&UfN)T1Noi3YXjlP}d2~SeEHNhs6uqEc zH7KbjLXtYDzJQEbAVL*nj3#4|D5y2YRHOhZbU0wi39aP3#Q}@PCXk;&!N9;;B>?j; zOp-_stNTL+7*fH-OJ*^w9Mym^bQC~guBXXZ1nMJcLL3*x0h2~|oFJ$R0~+Rl7RB-L zop4t&RY}5JiJ^*2=fc8B1I9o&R~!+RMT#iRPjDOemSB85OcS_*h>!2Z?ou>WesHIP zk{c)ofRj=WI0t}6sInMmGo&!pFk~^!W|+%T!G!gb17Bmr#8dhYH6wY7 zR#NcOWWB`-b`(<20aW7_Nq{1c4V)2*)EF2TqL3^7qRJ>Pu(@E%qlCe1RI8(;u?WH} zMo+VR@t{@#yfrWplng*U5C$e0MiC|fMjKK@+q~WdwHJwn^5$$9hgp8I;38Lv2MGAeJVG&;k*7dY+&*RsqNbpvdOn zVPWK9u@Y2CpftuHy$x_ZoSB!AT9jD=YScpN32@ZoXlH{)or-hvONx=le83vOgnD2?3W_RKBFFDh{@D#|a4VvjEXjS(k< zLmgZg++qQZ%7UE<@dqeXLs;O{&ta1b9u%_!ITt*B$HL4ZA|NgxE+EgusKd<1D8R_W HBwz*rE+xUu literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd46f1024d325913460a1ff1cd27be1d3df2d0f9 GIT binary patch literal 17106 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 V%q7Yt!X?JU$iv9T$i~dV2mt+Z$Nc~R literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f2250fb0ebfdf2b6f1b6df9b28c9af12f358dfc GIT binary patch literal 33952 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6daebb0345696f9454e27b055013a322e05367cf GIT binary patch literal 23794 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bad3389f4be3a0fdbf04611975bb7f2ba26e02a GIT binary patch literal 3384 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e93e409e731bbc4577d152bada6713be471df4cd GIT binary patch literal 23861 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 F9010vpy&Vq literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08ab62ce536909124c0f02c0a9d058c28936f6bc GIT binary patch literal 6582 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 OLW}~89E=hyY>WVMWyCcA literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..597b62e7dc7adceb5d955f8b7bd1477ec400f723 GIT binary patch literal 14409 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5177029601e8e58cc8aa1c91ea393038c6abd8a GIT binary patch literal 6160 zcmZ?b<>g{vU|{&dY#d!G$-wX!#DQTB1_lNP1_p-W6$}gvDGX5zDU2yhIgC+EDU2!1 zIn22%QLKy%l{{ckwkY;+hCCS-hE$Ght|A9U1`tePiegV;isFo9$m5A%Naadp&*E-o zjN%0A;E7^Oiyo)VwnNoXjNs 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 DO(g+N literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/imp.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/imp.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6a94722c694c0373a8c87c6551b70633924bfd GIT binary patch literal 9753 zcmZ?b<>g{vU|{&dY#hB-lY!wehy%kM3=9ko3=9m#rx+O+QW&BbQW#U1au{=&qL^}- zqnLA9qF8cSqgZppKrn?RiaU}ak0}CVDr*jJE?*R1E`Jn%u0WJPu3(fPBS@SrM<`b~N*K&$ z&k@NLjS>a3IdVjD#iGQ(Y?d66D3KJ#6qX$EC~+_?5hVepC8H$4v{aN7n3j%`PLzOw~^nZf1!xPO(bSO3`j%j50~lNzrX#h%!ylOVMv(h%!sDPBBO^ zY+;NtPccd{ZefVBNHIwZhlH>PO3sdQGQuwN@}q}Nk*zda(-?>eqL%`NwGp+YHCVqib6@gLQ-jFPKrWh zerb_HetDike0*kZL4Hw5d^}fLX3mlLUMjyab`+tkwR&4 zW?nkjQ4s5LGLxWARxgHIoS2hYQmK$%mRh7xg7A|b7uQQrD%Rw@#hH_zoE@K$nv-&i zCo#FOG_xo*9wc;&rzkZiHL)1V6HHGniBBuauS(5}&rixqO)j}5m{|-HDM(DtPE1d| z#hsa#2~&29E3-Hr6fz~5dAB&>YHta|r)5^eC+EkfW#**jCFZ7TGT!1#E=o--NsUjb z%uCG8O!m`cxy2Fh8Wa@o8|;3IH9oZ>HTf26d`^C1$}J(7nIOA!#Zp?5nNyVkipI>`0%%x)0yrhLpeQvt z5fm|*c?xNXW#E`hQ-Fu7wL)=fDmbWf!D&LhSOFH9iJ<6JNXsu$NX#ioEy_zQ$t+7% zC@oGce#ykZz@W)^i>tUKF*!RYwJbH~B_jg^!%Jom!2%*!K?EC!U;y zAyFYOwH)e4J%~(5Mk-VQuz@i1&)28Z?=1v6fU8q!!=e z@&)@lq_O}MT`ZtbU&&CUz`(%pD@s4KIJKx)KR+k4EHkyJAhD<a$ClzG6epzZ>nSM@Yl70bLp|PI1er9fg zUP0w8uDsOpc!-+}Kp_AMQ3j48B~TE7f(M2{!2}K>P*|2QWI=+*0bB3{rIwTyy zF+DR`A+IzyDYXb3gL(y($qJxkS*!;RN=>FBAqED9TRgsw?w-!^exbfju0dd5BN2)q z6`Y{#kqa`<8tzWkA{CtO1jRJSomouah*ZIFRY_txx|1}SZ!s5F7T@B_%q_@C1r;RV zw0Da$IWajSHNGS<9m!Ros3`(FjUD8)lEidy_<#eDsYnClFff~efdNE=5*=8976StV zD2**-=$Bvwv6xaA7cw$3lrS$~sbQ#LT*ws65Xcb35W$cFayoP3LPiD#Y~k#lS(XY3 z=7PkM3{WYVsGwI+2@YNzg(5^Oz@#%via`n>5dckqpcD(!q>z%ITC4y{wV;9*WMFDV zW^su%q+BZo1xh87E4)V*-OVt7C&jS_KxuwM=3Q4I7i3&;i`8lbHc?yYn zDIle##i=O@nR#G$6yzi(rz+&9fiqlMPGWkoUVcGIW^QH`r~&|GVNZx0$V-TL)`Leg z$Uu<25NrMNOFUr-A~nUes3^Y(q@XAdHF@DewwVeILZ@?@-p+%i*NBI zCzd2<#KZYK;6O}G%LEl@7aj06|K7pk!C1%fP_k z0m=)YEXlyf#mL1779*}`OROU;StaWcOjuwA(CCDwD@a-+H(`Mz6I7YNQw~zPD#=$! z&MzuTEiTB<1Gf>N3L#eNDJXcRDS(0zY&qB@P|8lu&r8cM$^|9v0M`HoV?z^jP$`g` zSfZm4mY7qT3W?tG%$yuhGK0pkf@d1o1W*A^y)*+W`~)HK4ykUz$w8B`NRNR5Qv5@r z9USAJ5;__bT4qIRv7Sv%esW??v7H`5F&VC61h-lOBIASoLxY@M zHJOTxK|yT-BESv;6X5VRWnf^)K{$tW%Zdyk4HWKx$arUe-vCb^R~JGS<{~WAWGNB^ z)qO(n0E`a~b#wEKa1Fl24{<(1K+q{N#MRl~#T723$$X0|wF1;u$jr|xzQqPfX16$! zDoaw6^Fa+CaqmFDDlf*bCsMOC_5SejNK70{YN z0n!MDmM6&|%V3s*T6W-MZp6UAP{WwQn9WoqR>F|N1nThhGBq*gNt7^VF)d)OVO+>q zq*ua_!cxPS!VHp00Vi(1TMSivsksFumEa-*)YyV%xhf%Wod;_7r(_nTCW9JNnk=`t zA}7Ndt?aCG1-q@$ujmdwdlqF9q7%YXCV29I8xJ5-3hVQsk$}2J!;PtoZm_T=7u7@$t8K;^PZT6T!B` z$KPU)k59=@j*l;L10^X?tpu?ZlrkVJko`rV)KUbp7gS|&u(2?4uz|(kg%~J?L4F0% z#h@Y(C0VhzGo&%5FsHDza7M9!*{msSEgVs-?F=joQJ_S|af>hBBQZHUHN`!(#3ivL zvC7vuKer&UBr_=!+)pbmEdX^KL1n&zI;bJ4u8>%i4(>D-gIWw_iA907& zh9Yb<7;6}^KpDoPh9Qd~i>X)vMAtIq36(H|WKtNLnOGQV z7~&afnQEB&xfmI0m=>@sWPmkF^LR>Fn;90cfwERGw24|}?Ov2$T&$3hn4Ar&S(Eeg zO7e?Jz<~(r7UwIZq$cJll9$ATJQ%4I+F%1SkTEKt|r;g~m^EYEBL;jzG3* zGD2Jcw%nJ2fuR*-IXIy+voP_o6oJH05;`b%gK|W%00RR9NJJem6=g zt};d8Dj+9nc=H5Qgn?5rq}bQc)brD1DZ=JAkn1674a@?2AdG>5VIjx^pb~V1hiw%D}(?E`wvhX&=;hs9|bmu4M+5ykH)43S%#GElUkU33C=pHd~QJ32O}t zh+V@V$!oGk5q-P;h4Qo7S4Qmz%bH#Jlum&?|GWlsT-eLoJ zCACPC2ka6^(^Gx6fuYa zD%K#T$H#*TJFuzoMd6_A$W|l|GK&M$kOUQikVFcSy2S!gcZ&^T3tI5q;szNAZO<PTOrwCBwXXd1)fM|HhR%MRDC6FdSEiI4{ zB&Lc)1_p*LAn!m^1&EJ5RYXxGRe;h&Gbl}P)UalOFlRg$Bu$_VT!e7JM z%oxl7Zfsz50{p-gSe0nCVo@!q3k>Q}B`QG2CN&vvNfnnSK{7;qacW{wat1t47HbL= zfxHba;EP;9Aqr~R7FmHD3x400Uv0H4Q9$R7w{z%n?Mj*IG z0Cj(Eal+faQJmm57$_4%ViX*YU;-SOJmAQLdgBBrE@eQ`#l!>4u#7y6ER1YSe4sjn zkqguq1~rf2Z2?d<3&J1|7K<@5Fw`)|FxRrwvevTIuofBAur6Q#jqwyIq%hU6X0sI; zlrW|+FJP)+UC0QEoxDdij43SH97Pc|Y$ePkEE!DMY()_%tP7ZG*cLL@vX?N{u!Gg@ z0?B7H73Gw$)-cpC)i5?Q2Q$>Lm9S(p6*ZKwp@^|(GZh^x;YeZ0<}5k}HGfA5XAM&d zTQgHXUoA%osKjNe;Q*Nd8E?wtfr^36&GV^YE8)s!D!NeuN;^!=OklfsvYCorl70v^v$0JT9tZc9}F zrFy?AJy2Z(?VKnSrGm%vQ^4&>$Y8dD2587t0o1`#sIJuncLA%kT=MhOOBAy6^2-%6 z^2`Jnlm^Nt=^(-!L|A|bQ1wv+DqxC0{h(Wr zR16*9FA4(HTf70@?(r_3L9Wgr{y~vNphSC%(>dNL)YB)#)9)4!I9tGH5CS6O-Gcn1 zT>XkbW93CopbC%^>=Lz-VFY1NvyF#Q1f2D_pxKXu ziHEVM9JyfSVPIf@XTT0d&;V-Bvq z6jF zQrK%)#2IQ?p(>ecSQj$YvVnPmpaP(11*otG+bsmKqi{tyLxoj|a5IAoL#!USs9~=K zWoM8%oM4?G8#&R;c@@A=_$r*Cuq}Y0uq~XSM5IJ?0W)Z-1D;8lYPnK4YuK~dComRe zm59}_rEoPf^^4VVmxwQrsNv3%T*wG=c`a8sLkbh5&;Y5bVXpztX4Z1oaM!Tau+*^E zKtoBBCs7B-IAbulf&gb6Sl)-`M%chzX0bwkZe|H+(kQ=30o2dcQGiq{P+j1ZtDBjp zqX3yVQ^+q;0JX|86LY}*Hb@Esj}U{pB$;`osW1aF^T30{pejL60loZ4PRz^8F990? z(wCT-r=YHL#w2i|q{(=TBQ-BMKP59ST~i7)nV6YZT#}fVoO+A7xTNS7XGmoM zWH_`4RPfwl0hMdFSU|Si;t49vE6L1-N`r=pit<545-1ZE6@plxHaMiR2i1y2DIhU$ zjSsHu*)oekg-KB!NEkG*1TJlgK=~L_a&eU8XQ$?6R;AwJPf0CFO)iOtIrSC?s6UvK znU|``11X$9rN=GS)Vz|S$|yl-xW>arZ;FZ;7#I-ZAZx*Mno*o!CMYnAN!kEofB*O?`+hCt)=;FT*3wahil;3hwKqOX<(#LHr?VW@!&P%_uDmasq? z;F>H|R@nRvn!SShT>;*}g?b4xrwUR5&h&no%#aKM?ys`t7iFer=4rA<3B%)34?cMh z=^G2X!iI~HyT_23>EMFY#`+I}u=fRWT;E87Nv>$jj2s}s+9#RDl zHx+@p;gAs%aAOhNHwL#DK}|t$8wyy;~eMx!@+Y9jI|w4C)xO zFzK)`F$ys9F>x_TF!F%AOQ0eUia~`SGYcaIWai-J;NW2866WCJ;N%nLlM!L%;uB)! U;^z?IQ06k>;O5|AW8~on0BZ`9T>t<8 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/io.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13ff46b33f163a6cb29f7f9794befb5eec017cc4 GIT binary patch literal 3463 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 Ve0(+=6X>2C(Cs*E;L|SH7y(7_oo4_5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..695773090a4c0e72b643c47c924962b91e4549a3 GIT binary patch literal 13947 zcmZ?b<>g{vU|{&lY#g1h#lY|w#DQTm1_lNP1_p*=4Q2+06ox2<6vh;$6y_9`6xI~B z6!sL36wVZ`6z&wB6y6lR6#f)}6u}gs6yX$+6wws16!8>^6v-5+6zLS16xkHH6!{c| z6vY&!6y+3^6x9^96!jF16wMT^6zvq96x|fP6#W!~6vGsw6yp?=6w?&5bh9YN6!R2| z9Hw06C>BPB6w4H~7KSL+6sr{F7KSLc6zdeu7KSMH6q^+77KSK}6x$T;7KSL!6uT7O z7KSLU6#Eq27KSM96o(Yk7KSLE6vq_V7KSL^6sHuq7KSLk6z3Gi7KSM16qgjH7KSMP z6xS5y7KSK+6t@(v7KSLn6!#Rd7KSLH6ps{%7KSL{RN*L*6wegZ7KSL%6t5J`7KSLX z6z>$R7KSMC6rU9J7KSK^6yFq`7KSLv6u%U`7KSLP6#o?c7KSM4lz6onRs6oqD{C@pt}l=u{l7KRj!W~M0Zl!O$%7KSLDl*APN7KSL@l%y1a z7KSLjl;jk_7KSMOl#~>q7KSK;l++ZF7KSLpl(ZDl7KSLJl=Kwg7KSL}l#CRq7KSL3 zl*|rfSCU$kmYAH%#TAl~S*(zopHiBWs*qYy zkY7|%tdOWsoLZugpQeyjnwMOXnV(mzkepvslv-SnpO=!Em#$EfuTYYas*ssiQk0oj zoSDp(4>h?Mq${AZBqKjhPeH*gzepjqA~ClhCsjuQrbI6>B}Jn`N1;+vA+uN^wXig^ zEHNiFuY?O~Xlg}4QEG8Fod5O8H#R`cInq~_jYN-ey_k(QI6UzCzrc8e)J z^%i@2Y6(Otz2p{4CfMlA#JrSS?3qyWI5XiI*fVpAGcwakZn0;!$t=h(zr~(e1Tlp5UOvd~;?ksBTp+hVJ;ae&QdF7>awtn?MSjsOrkvDU+&QUv=_MKQ8JT${x7eVr zVah4F#Rhc{4i*7N4T*nM@C{teQE#|z`^jj=>`6cnUnDdL`Z!s6-7lVlM zTWnAlu@^%_gBj!)c9{LFB}Jtr8Ml}#@{3-Ast!%YB1Q%VhGZrXhk=0sM1!z1s4C%L zU|^_WsA0@z2xib^tl|q!%uQ8D1Z4vog(SU|44O>07!z+XCKXvQFff3LU-9~(#i>Qb z`uRDTWtpi(1&Ku^sd>fOmHGii`RPT8xyAaBlEZBklJvk% z)nqEN1UcIZM8G{zWDVjfGcYj76Kx3-x+S(mS;EP{zyPwSm?)nxqg$d#lqK2>3=HZ- z`-BzU5<8+S;bvf909izwPguZ~ASEU{VxokXfq_9E$s?dt3re#f8ic_KmJOU>dC-z; zUVe!}A~ez&A(4(2-?|J845ow(=K&jD#F4@n%#Z?#bLJ|opwyDmqCAC=qS91_%ru2W zP{|F-YB~yTi8;lo3i%}&sYT_P#i@EBZje-m-2ouWL8+0r5aa-dAX2K%EG8xhWf>S4 zY>|8kPIox-JSW%^VMNx+ELH%8BoWz1j)8%}5y>J@{J`Q0WGOhVK!r;QLk&YSdLB(G z)=1RU(`3BG5}%k-6OlcJC3ZyByM_!53=PEkL;_+7QatDq z6A#7=3=A#A+98c$2T^692?GN|2eEcIV%QN!j6XnQFg;l802T5e432dTaH6YWNMUSd zDpp8gDq#fGfmuvq47E%p%r#8Sj7^N7;tO19F;}U=ibimyr33ELB`ScrYDo&ksfDGW zURbf-E$;YuX!j>RzDiMDwOCytKPf9UxkMp3F;BfjAt_Y>(g{kT}&<0X4gCam2@ix{&elw>U#83sPN+it>vznIWwuP!stUb8c}uxa@=w;C3=A0|Ub( zkcUA@nSqImk&lss5l@qxv4$a=4cxBKfO#uPAu~@QQ9&awza&+mD77rL2-I-}xA^l? ziZ!9lHax{OD1XibxdD`~kU9h`3=9nLKnL|2QW$HQDr9OHTo__SYME=8YZ$YcinwZ+ zQkcvcYMBbT!Wn8HtvXF;s}9s(%`44KN-YBSUNb=*>?DQ!U?+Ja{JY(`35EnVMIc3mWQ4y~P!lm{ST(=19?2|qE2jx=!w28OjD|AB&ufk}vwgOP(N8I-<2#X5)vVQ@f#f}(~A6qGg?kp>D( z1zUw=Sfn9mFvetvec-+c*is_~28OL5OF@x@l(a$F4&)B7btfR@31bPQJYg(hs$pzq z%wh(YCoGWiq>`hA6;#RuGq5m}uw-);*?`9J7#SiN@|YqRD)~y7K(bkEwanoRc_J(f zCG6Q;MF|i!HH^Uw5e$_)HOwG2wJcB-AXA!(f!lEK$f!tOPqPzbv&#S0TShp)@ZgwMZB4tE5Vh)rmz(nI%Pu zMU@JPxuCHwJ@D`zn)!)&V3RWQN>bBPixli^6$~KWuF^*<^1(f|RM0?VYEeN^YDsDe zc;F@vERvpDRHYstk2C-kAFq&GS`4lxpoZ&!^N(sVxQMG#K~t@vsZgAeUz(GmPz31# zgPfwtb&D&rI5V%fBrz{J6*Op8QUsckC<65bi=03ii#aDX?-oCrVYm1kOG=6|lS)e< z`SBK?Uw(-vZ1^xWrO1PUfkBh?7IS`57H9x4EwMDGqzIJwqgcSBXUt`ZIp}#ug@J)# zCn)cLDt-n|E=DFs9!3r(CPofMK1MbsCPqFe%>$wtIT%6ZFjx(k&B2%q%GfXr%77rR z6oX7lWr$)-VTfW%VT@u=YIfxC!QK1+#Q;>d(Q7;+Pi~yxKP+9{yR~VFfWf&M3 zD#SWKjTXLIMo`sR!`RGJ%TUM`&QJp~oY7B{5j^w_vO$xnC=is*SU`cJ$#{zuL>EJ{ z2B=24#gbNji5$;F-S`dLo8n{V+~^mLo;I-10zEr z6F8I@VeOb(OnL^l*dXrFWCVK%;e%hCHtDH(ps5hM-ym;*OlM)JG9l;%gooe;fC8wb zv>+!HY6~^7LY5WSV3fQ5y(`qzciVO;z61sK?FFKI6xyT zpjdbVvK16&4B+C4gOP)gi;;(ggNcVxfRTr(N*H7mB&6Um2T%5(paBIusGux{v?CWV z)G#gtkGJ`0GJ>6|$y5X?=#WAg-uwV{2|)QMKK>ub86e{r7}2bR$iw3rlsw=K6Hp19 z!dSzQ#gGLdnNpY*Fqg1^nj%?j%}fg!)0n}-C(M3ToT|los>K?r#hO)2ItrTXw>abD zlXDV_i{s;OamB|&W{u+GZ}G&(7nUaGfRc55{4JKO{LH+fBv4?p6r~mvfg?hb5#l4T zKfnYmOhHQG;~5zl7>XgOpM#MN-9r#HC>{cN92|z=h8;r|Lk&X~V;ZQd!04yRRFnpa zHc$${VKG;Hd{JsjX>w|OJR8VrkZ}x*RiY?S2UFpv$qA_~(?Oh*;Ejb4I)4zFyN$wM1VXEPJNF+kq2@*2RjQR3loPB2QvpND9%A; z4H$!5L}}%wz`(#zbpu>d!y0bH)@-0g95Iy|NF5}tYZ&3K&!UZDk?S5%ZHBB-N5ND_ z!5CRPS~V7J6sx096m1G7jbk;zUIN!GAY+QbnFgN4Kt&-ai-BtvP|u-*u~?yl0bGwD z6^zi@gE3DDB-gw@g8|Y`|u zEGh(vf&vumNKK|9geW+yK{-+oWDXxFOEI#5y7WvOOpsCUDsDxe|79=MbOx9&4R;R7m(i?Tp0P#|J24~sx0mIBDV$Yn5! zo5?JL@z@C}AXPzjLc>TD%|1x+j9K^=<$^o|YBCaCP3Bvy;PJ{^tnrCO>BYC$(CFLBa#vO@@?X;I!LqB+Dc_b)XAXo8kD|3o+$=RcGob(ip4P1GS)JsFw`*C zFr_hx!Kyq^7%)|_sutU-7C|d)W^m1Si!u8aV;Q(Qfe_$W0abiXFt4*PRB51j9a1)8 zsqE03(AKPi7f_Qai&>lj)UF0aP7X^h zYb_%vvfwH}X^No_)RkZcs{-|Ynf<`I2h?)|Ej7wa%+X{k0_6ip{RHwo*u%FtLCu?z z{QR8aqH54+5;XOJ*pSdico9@txP!b1YHcwvvN4J<@i112V?+cMD-BRlt^u+V6sjC- z;7Ws=gPDT^CA)#rIXL)0szBq*<_xvaL4Ycx$wO_T*6e`VDS;p>K?#|G3D>j@%qm~3 zR;dwX6+Z(518Cf<7{e-1f&gK#uRt@tpnOVbVhrwU<|;M#B!vRV*PuG0NC9(ptjG>j zxDqofR%8!K^PtWUq#Fh*YmsNcAjK&-t$+z|o)7@7N&p2VsQCt)1tS!oGKc^bK=?vm zpQsQO1TEPE*@zLMpfm!);1GpHo;OyzY;1_K3sgO15O0??!Y-sVsY;YpA`A=+xx`y# ziPb7CqO1}H#WV3%31YR%fhem$J-2e=t@6ieRSi*ANr478iMPrbVHHvu)FLhfL5naO ziMPuKt6g@)EieR)g0>NFmj%Kuq%^2YR1nHDFfeozZ$pu7_11?F)IR9v_+t*uLx8r z6@g0bB2Zyk1S;i}(5ZzGIuFWEhtVbR@lovYphe^H@!()jDuyyrQlN}H z5Q8T^9=38lKE4RFh7+VMGp`IXJPKKu4q-zUl0!7-=7Th|$H(WEf}#^NkP2Sw4w21E zO@}xuzX&2wkPo%JAio@97-TIuM7FpzDLx*w&IGi+H6;^dHG6z~1xRxgSA0BVbqQpM z7CO%gGL1Vv9=c*bJ|0{RgG_)fO$Vj0_;}DleHaVm*(mP#c<6%t`1o7A@$v9Q`w;7) z3-_T~AYKFwm_z&s(hONY4{>!S$bF!ZY|wgrr~zg{vU|{&lY#d!PnStRkhy%mI3=9ko3=9m#uhVo7DnVvS-;VNPL5VNGF6VNc;m;Y{I5;ZEU6;Z5O7;ZG4r5lj(E5l#_F5lt74 zVowoE5pQ9L;z*H5k!)dz;!KfBWy@wOdXpj*#g!r*#ht>KB9p@t!cZxd!k8kP!;{M! z#mmT$%D#XvMQ$M@BSSbto(Ky=Dt|Ut(IQ3$5R7EVV~T*dPasOLQXqvfMLvfoS13vd zMfC-cT1EyW)jUx=sq71cQ#n(4ni)Z6NAu*(OHly1X98nUQ;I?qSBfIkMIvw)iC}S& z7{o;r7>mp>Y!QtT1c#MKlnB%|5vXkrDnz^##F&nrYx}( zWgC!xRdU30C88v9C8H#BrJ|&ArK6;CWujzqWus(s<)Y+r<)h>o8KT)zIZ{-c87D9o z?Mqc?W{6TuQA<&8VTe*nRc>a8Qb|=x(MZv3W@2PWRZ7uH(T1{gQgop#y%c>Y%OJ%N z$}&nZhO$gjOrb2Z6muxcBE=HQvP!XrvTRapp)9);dnn5x#SzMKN^yp>T%ashsBJ1y zsu(U+iBf}$xuv*6b$GyC?+JIkSBf`O)+@ya%JNO|1G7{XsHZZ6;yqO<#XltgET)ta z2(?!!B?!(6P6+|aa-@WULsBi3BP9&VQc4L=2?filL}|cXg$Pq@AsLYp3D%*M5(RZL zM@lrtn<;{=u>k5nTtPXoeB*_D!wJ=0krBtWXv@k?jr_`p@wJ=24fZbh^QkGJYQk7DZQkTvKvMFVEN_|R03uBaR z%ASWLv5G;g86Z}XM+#$9U`hfDLsU>yFxZ@# zDYH^$LsQ0_l({VoQ6VYwQl_^sM1`izPg&5y5EYiPFlA8-LsWRm;*=#V3{eqaebZAG zq%2BVlFkBh2h66Tf|R8x%UT$sB2$*9tY~3~0)>ch%CeLd=}b^{i@@%fk+L#nRSQE@ zbjs?KH7yKLF<>)SrL2LdOWB{YK1HO3F)G%bA!S3##ukQ@jm=C^aVeWpgj*P*;!`%K zY-wSLN=W5M*$OhR_)2O*RAS23)WrBCcZQU0Dcf5ZQnsfuW+gW>N2R1N1v6+KNc3Z2 zVDJxCD9SG_$;?YFR!GY)Qt%5=$S+a|$S=;UP)JEFNX<*h%u83u&r>MRNGwq(t}HG| z%~dE*RWC|a$j{T`;tI*gELKRZD9A4=DYoKLP|#IK%*jzmE6qzT$;{6yR!A$#&s8V@ z8<$_CkXNFkkgAuir%;-glbM&TqflIu2ofqu)&uL!FV-taEXhy+nVDIVky-@N3Kj!v z2eDu(^AdAYkyNUKZBYj~Up=ox9i}R|v?wLB2&67ip}3?7{^7OB9mxb93|aG!;O81pBQxwIH!5u_V7pK|@_1;<1<*gnLpeN{|dnttd&& zE6&W%Q$W&&#TSV=$hs19N>YpR5=&CC+Ul2|mkJI~eT1zb*CAP(oS$2ep9cy>eu` zsVNGXc?v24jv*cjsU^v<5X=E3GlbtkTqM_K<|&k=qj&^W9>D zWSv{g#i<3i*g??-W`N=!%z(z_Ef$caw^%?5Zm~n7=@v(@tE+c>uxkjEU0gH2*fO96TG7Ha{RVuR$HWJZu%85kHqG!p{@ zgEOcP0O}^xFqAMfGi0*`GiWmUX)@koPtVCuO3W$NWGv!jU|?9uP$b5{!0;iyo z)VwnNq|7{hJw5%L%q0B+uzF)XbA3=aSKeZePp!x-E-6+8xeVk)2F4-@1_lNcr*puZ zZp6UAP{~!oP{WYL*vuHrz`{_%l+9J71FfJLQjRs9}f|sb#ETOkt2@NMX!oE@G)+oXAwj63n2}EGa3IMFZppP?#|=GBI*7@-Y@EF)%QI(nfJ+#VtlIO~zY{TAGZvSmRSG zGE0io7#J8d8E^5&XC#)T#=~>lEvCGZDkfg8D(O5>rcfv@NKMX6%S={)I71;VzceqU ziX9Yo267#O1XJRHMZ29Yb!h zB_=1Q78ghHLd2ateEnSG$jIF6l*}TiMZVr{o^JjiSLJ4> zWv1oB)%rmkm7ATHp8_@0Kfo2_Bop5U5++oIPATgFt}> zQUmd`8#pKt3jD+Upq9G1fZPt!zz)g`DVasL*o%`B^FVr`LF*df>Kx{Jiw#ujm8HV; zg#?BAIXi~9-r^`JD$PqyEJ=lin;X~e77R7m$JxWp$I(6b7JG6=T25kmG1NakV9(uR%Sp}vB?yR* zeVjc&o`iV82kfNaC@yf!_<)R!;_?lS5BKzQ@edDv2`X$}f^x*m|BMU_Zpok=1m zvJ&hru+m~3g`&jF;#7siJO%$?a1{VD5-b;=pABl$fdfZR!5`FpCV z2&l|f0c8a)K1LQsK1Lx%CPo29J|;Fs7Dg^cE=CSU7DgsUK1M!fK1Q$(c!dwjL-4$l z1I|03_5mY93F87LP%4dKs%5NYs$nYD0E;k!^AKY#Q-xg(V^LZSQ&Cza52ylah74DV zu`rY{XLA*WK+<~vG=-z;Ez}BUNMQsuAQIOwGB6aS=H{0nQawtd1{a~$3J@gK@z>RkuP~ri#`O&fqG?f&Wg6q1p(wv-1s4G%*;JGR@wOAoJ zzo;m+xF8?WO)kktB!6(10_+ZGJ}HLhg@U3|Py;=&Jh4)tG_NExMj%;JQ12hL4ga+ z6n>g4MYf=33Md;C`G8nKpav2%IOP_Ff&{`q1h@qTCcw=wE=UZ5inb@9)Cy|!FmQ7) zLeeW2BNHPJBOfCNV^KJA^9R%pfv3(qaOzyZSOZCeOts84Ohp(}oF@K0$?X zu||GQijG2FYB_2G1-A|0#V&080F*L7!IuhZDJ2$Fg1bm5pk_a);Hp%}NlhyOCk=4Q z)l*PF6u}CR<_5g{1sCX`f-65wAu$h2Do3_6FEuqKH3igB0~JZ2cm}x`oDxBvP)N_u zPXQH?p!AVjP?DMgc0^icQE`c$f`VfjsILmj4KOz#n~giAgAGBh5sE=QU648XIVlQY zi($0@H07fwdawy7310yv(JSQT=YfL?DSc*w#;Z#6Qea6lza-U40i66{t#pOt#5{$x z#LOIp^30M9cxb>pRS6mnDorjaElO3$O-zC2k~D?N{8ELS#N=#+g4Cki%wo`xO0fbW zWFgHvuxV(8Mt%|4AE5CBn4>h=!8HaXtN4O)2B^d?vI4O{X}t)XeOPWW=jWu{V$Mq~ z$DN1RA(2x23!Z`aK}9_WxD&$x%|b;{3=9k*$)KDAst^Pj7#Kj^ie!+UFN~nJ5vY8x zWk_eJWl3kKWld+OWvk>VVFZh^hco0EL3@osj109Lj0{yGpjJ^fXOUA4Qw;|wZ-H_~ z3S%ut9Y+MTbgyBbz}U~g$S{GS;#;LgB~J-+4SO?VEoV4G9;iM5wWC@fc?(t_Alb7E z&7M`b?WyFc;atGFkfD|dprclT(;#xga^WhO6jH4a)+y8qO?sP^T!5r-l{5 zt6?losNpI~s9~PKSR|6dT+5xO2R4^uAww-sI76Nk#M}vtMOJW=d7viq@G#VJ*Kijl z)Ubg~tm=MkYs?P!$f*2wgY8WRl79FTz0JRCzn8O$t8A>>_xJo#)xS1Ggd29J9 z@@iOI7-CIo`D^%U7;5;NnQ8?NNGwq($uCgQ$jnR5DFu%am*f|K(|=}3acWMQ zjzUst38<=t%Bt(BgG)hmJw0_z9fiuw)SQ%Jg+v8o-ICIRoK#4o3)GxV$t(huCE#in zRCW~WfCmJ@Oo%F|3UEON%EOs?>EHn}a5)Dm{6IwyJeTV!fP4Vf4$%SXLMh~@f!zvH z36aW&v_OkXlVCbQg?J`tXb$Wi1&!1Sm`_ps0vfnhKsXV_4sa=fVt!tJo-WLSO0ceC z&`2rNOAxdC@=H=7^)bSEps~@6R0WXRixohleBkyr*k~O{@s^hl@jqy!1w0^I3^6Sv zUjfvnPE-K3VjxO1$}=*PGZd0i(=+oxtrAe-m|vg?3c5tFn?NlMgex=iz+nY-qmDuf zXvhORPOk?V_S1k%fSjWVO;4U_3i$<~VZ+26g~XzC1@)5rf|UI7Jate2l@yhN$CW`n z0O-(3Y6>I{ONufJa#F!Vw}~)op=0uy#jsQh8r@7y%P#^2Q>p?)3#d9M0#}jwpe{zS z0%}x(%>p?UY#1nRL7@m~1cA~sC^3WFr>Um^?u|fP3vz54sI!IaIIvNmxf0~&5{lyz z;Wa6W+j4S16=P-zqzi)TJ_S5(OUf@P$HiIoXgFEO_u4(qBpibqn)Bc7Ou~%}eDO`NgT=1^}pkm7AEE2Tki> z$5=yZYfvSflnNTm1~**5Ed+#t;L&^?kh4ni6+k2HpcXA+xGldZCAA0?sAZYOnV{($ zJp~2d{FKbJO3>5}+}q_DsgN`bO@yE@14k=}k(rm8mX?}al3A9jqfnd)8mI^5J6QS$ zB^5|90Cu$kXdn>mS!mx>Aqg~qk4Q*KkRS&QW+4?k;4%?p8(g8Df?vKuE~q62X*PiD zEKAG*WsEdf+(P0Ml<7f!Lj^n0%R`CFOY_4W(j)c0GB8T zmqChIr%KRN0(epd+~t7I<$=u0FV=&OKWS(xfRY^80B8>boPofuKrI0B^T5V{3jm}{ zpIM?%oRMFelL8tg0F_dZnL}%ZOh^+M)^r3}lbQl4>p;^|iACw9pyUafyFd&DK>OJs zH1{q)g3BiXAz{Zs1D550pwk5uI3;n3)5f^aOhkBxDYEUQ2^DPI-r`lII{|xHu8%UK#ePK%Lm%(0XGivi}gVM&`^iW59#}4 zCh4cR!Ipm76(!ZQCD1=s}Y@^ zS^~0M1LPE_PEZ_ZYJzKD5EE2fgOY4kb3n-9ov4G-1Q}7mZNq)gCc4%dCiyd0BMR6l#fm%`Qk!4CG1$a62FBO6cmGVn|h-ngT9&!J!6PWdc#Ipa82p z;UN)O^Z?)!*fbd7%EkLUw9u0aya=I8X(isF0JNmkwII zm0FaU4;!HaS%z9mf<#bjN{|T1grfZX5^(Z|<_FNUPkw$0D01^a?I4Kf@m7c+qac+X z#4vo7B0?>=VgxmBOA<@Kvv6Qn#HXd$f=o$E(bOw0i3io1;J5L)-k{tf=K`#D&K9RSWic6x{gX2Ae z!PD2pCGp_dEztbIEso;E+|=Td#FATV@!$w83Iyq8P0qD0xd=;N(C951|r}t zxy7Del$jo1Tyl%GB)=dn1+5ai#R@iT8K@crO+hdyiZF68gC@rKz!PHvjC_nDOhwh8 zsRlOCC@BL2g8%~q0}n_5G*EgCF;L2u&QQyq&QQxy!(1#;!&)Sh!jQ+5&QQx)F$Fvj z*HgSeCw$x{OBPW(iDWW z89|G@iugfE4%8kiiU+Yk*e&L&%z`3NO25VDSX`W11nSs;=itC8zo;0b8kD?? z%0MhoyRE1k#Hs-0A%UVQP!kW-bOcqOQS6z;;Px|mGS39*NCy!aVD+HpVPgEwGv#F(w9vVvsKwSc@7#g#u{l38hr-MM|NsB@(_}1i1SLi0qIytbY5*0v%&B>0=wSg~N|ci- z3knSId=e`MV^IroaDajc6eQr_z#7q0!JaQb_B;{(h7M0>7DE^FLK{Yjphg8`O);c9 zOI(V;3L% zB9aU^b-|NOQ4<3L11QYcL5?pgNYzA2Iz`Q(LQ8-O*q@os7YD95@k}Y^mbrgGIQF>8o zaY+{? z3@Gz~+H>G!bBcihv>lZxhoP3Sh9QM1o1;jigt3;PhH(MYLWcfHj35?s3Udj|LMBFr zO1>I~1*|D73mI#fplcRDD~$pmjrSC$S|&&XzJ$GKRV7aiLkg=TLoG8@B}WMxI4M*? zR6{n_)i9+nWpftwlyIi7fi}t3FoRa-fyGvpaMduCa5pm*tt#OGt!@I@nZg8JmjKeo zQFNe$7o>gxUkU$0P|?9&^*JcDq_ijxG|-)@P@Gy=nhKi#$_J07zy?<#Ls_tS7{~@2 zXq^meae<;G1-Z$lQJk5ZnUh!q8VgBOD9%XD$87ThXLlc!s?CjLa zVoiZt9Oa2cd6{|X#YJ792034HVo7pFJWMc(r#KTdE0C56+Gcf&#|gCfGaRDh7IS)P z$t}*1$^z(41~KS3P;orCOArtBz%35%)JkwRy2TX+njZwS!F_OWf4K-$DHL&ls$uYg zJW!WblLb;dP6CO7Mq8t};F&22J;#7DcLpfOfR_6+aB+Y}h*`K8d6>X!Mj1i52Q(5a z#K^`3>MnqCk`QzpS(EV=pD(15?weRpkeQbb8s7zFJTL~;XP{B|;t&P~hE#?q#uNs~ zZu%C6C}z+;`WA*L@Lu{BhA39he)<-MC^pcZ`WA*LcF?|h@a}ou6h83odHxiE7KSJ; z&>s61hA8e7;a~<$ky{+`u8?MMGAIZ@)`Dn|&EO0R@>2~{4MRKwsQiv+tYN8Ph-a!{ ztzn2~1`QF%vw%wEc-9)m8isf_aGA*Hr^$Yc6SAo&JGJr_CuCOF3w>V1kic`TX*7%gfl0;38TP&dEFt=DhyrS8l2$=&S=7NZMAYwj2v-Th{H_O6nGEtcC=ftxD^Ngy1Hlfo zGf1R{A&a2~v^Jh`A-K~5*~SarBV+_AV@jB67@HYW7@DBvQVqib<{Bn&NdekcQnV1{ zNU#^CgIFNfYcdxt0#zE!px|KzhXq>ty2Tw2+Juu?lA0SIzYydTP-zOt11Pq$m}?kq zz;!fe2Nw$@*ufzV4s4J=pbjru3i8P^5CIN&FaZvI?s(9y8Hj6Ef}9NsP6p5f2qO=w zql@8=#v1xAppGKU(IBUS9LmVZ04njbm};18K|2oQpev{CpfSOW8WXUD3H1s%wSat4 z1d0e`uS9V{l4weHY9*G4NJ-6s_-H-IN1zceh>t)SoR0}5D&R`tH6bi2KzY0v)NBAX zML~PbY8fjeY8YJ@Vg;a4!L*PujDeA%Pyo~vfo!8=E|LWWGT70e3;=cXEf!Eg3W)`9 z*n_P_QJ5b)cCoP{R?f@lvriF|PnZRMq1RY%As#YwjwNe0)ewxg;*g%^}6HAIfVO|8y zu~MLzfG2#EkN}1JFHRfKT9Ar@BD=$|U|?aaQb7s^&<^VOc%&VBFb$e4Me9JOCxHl1 zWZz;1CAeZ_OJHn}U7$h^V%R~DRp3}=1U1f3Vi}?W9zZCu49b?ESO#rr1m$){(9COc z3Ct33dIA$*>sXTW3o4I+tb#@^FWgrk8I)oN6c6Bp1ln^6svxr2iv&Q$3#f1btuU7a z?Vn`y1E(QqdWNKAY~=}8acT*4lk!QB{V=a`Fjfh}-GETzr^y2f8&Jb4KK>S0JZRj! zG$%Da{uWPsd|_!~4n(GC2`HeKgNPL%VkL-J4Iaj(Gl&4~i~>6pi2#L2(JTfA zhUp*&34x|)896vPI5^liI62rjm^oNEn8EV!Y6TQ%pwI^g3#eFz7EEA6HJNbxp2H?5 zF*hkC(e5J1Do_nov;*WUPnGChe6<(limJ1nN7-B_Ym}*&SS!-B9yTxi)ni*{v3XQ@U@-#|VKr53w8QU4t z7(qt^wQzJYfY}@=oGl!+j2#TMOeIXU%q47Kos1m}HH;&QkWLs%Fo41q zybTxB^#LXC637fWQwk$wmOP6^i~-yO0Hr}DzbcX9k|NMK45`T_prw?c)~jl{stwgaO6oO#;VKo)*5M038!H~kV5OgR8GmenF#a~=nRFt2dSdyAr zoSayYs>y~Hv_-o?=@}HVMf(uJ3*JTs+Mk}8myYB&kc#&pzafRM9Io(%_z%11K!IBW zt`t%j!5(1pE7}jX{uUdgeX0qGXHCYU10V+?^2$L528PcdH$cM|r~OcKI3Xhd;Istl z>=bPPB`D_N%Hmt1>8T~4QFX`)Gq8I>{sk2+MY}+%IOAdMVokQ9Jq!#CMIhV3QCzeb z#D&*J;6T!30*4{Q#h{FRiw`w$?t$D5+7Zpb$ic+H0_xTCFtLCpD401Id00SfkQfLT z9Yr5^1f>jc0R{>@$PS?zNZ>J6t#nTXZFj`l^#qM;fjZ0JekN!p9J-Mav?>X_RS?p> z1g(RBFOMruP0k0M1OZ*F29JGD{=zW5TfP6M<;5VW){ zrv$vxvbdy3Pm>AUMQV3 zcP$*X3{W0(3Ja+A0=0G0K&2xq;;aZ*G65H{pi>e+l~glhEdyvXQ3+Es6X=wJ1vqwd!TlVf<_{ESw}!(Nrq2mcB+m7I6T0saf?fez&jH_ zSpZSSfX9zP0ShZ^AnSP5(MoA`=z`yj#JrT8)FOBe1{<#c8i-2FOHWOKNx&lmt zCc<{m{z~vl3eXCRB5+9yswqH~2*~T8pweUlmx{O8zzYY9A^8WC9>7Dh%Am9WYUMDn zff~^~OjT0xX~m#JQIZk$bsF@<6znw$$#LldK6HinxCF0;1qB4iOOP6a!q@~geGqY} z;15~u42pn36PMr;5LD-BG8UbN6usc;_zWng!t*qEEKi@fIE2>9%tePlMjQs!vXYq9 za4IC3XflD52iSaYl7S|pBC!3SBd8Py*SVllsf3}1sf4kF zDUGR_saULpIfW72l4UAV0*!A=G8Ai-u%s}9#7bD389?pr;(|(*8fNemhgS^?XtD-$ z!a^Pogk8f7ns5(iC_DxoJz+~>0WCF&WGFlq!H^eL!%)HwI-#M4HJG8oqlBXdd~!n! zQ!QI9dkH6Kw_?$Z!n(q`5-u=%RS7qU=4J?HDB%IIiguOog6Lp|6225xkh==&pd%Y> zepPabMd@XTVQU5O-V4x_U?O;x0(i8!N(rn8ywg@8H76CcaRJm805#K-QWd~^TVI0a zOhu|3`W9DQ6}ZgGT%xCZ$Kd%EA^4EJ<% zjqnTss{k=Thj4@jL#A&yia?{d=yNzMpv|^X%mtY#Q7q*klDW8~7@Wc&1UPAN#zWFf zYMKuyZGlGd7@$i^I6%u#n3xzr3s3|=OHG(T3sgWO&mbC9hH)@*FcsYa)%>8k3zVKf zG(0_lM!!K-4=7EfFqSYjgI4o0C5nPpe}NOK257+kKD)Qdrfe1MLEOGyP)GMS()l%V}OdHF@Tpw0T$T=}4r0>I~5 zK<(2F_H@?)&8-xrDg=AFgO=#dI8iogUY z=87&bFfe3;;tbS&U|@%DECw~autq@*Gc*bq6RqG;kctrpkm+g4BLWg*pjjyRjv@tU z0}7PI^iTsGQbeHy`=E^{O=vWM*XppKM-yoN6q3Qoc#Q3=;R>sf*nXip=K?v;hMEtK@~iKtObj%f(E4Mx(A9bP~HL+b0C^f z9*aRl7wMUddXWZ+U2v&WT2PRanVK@pav^A8i6&9GkOPtn3sSp~;`Kf#Ucp5u0|Nu7 z`U1r*c-b7J;|l6vfmZZ@W+@WE`*%Q9R}M-JgshXKyvQ8NWg;WELLyXaL7S*KbKo(+ zUi1Jt20)FHD><2)K_?wDBkHmo)NBTh6dF`!!z&lT zRuF=#BjU0Vq%zA%T?&drP<%0Pa4;4O)3Z;2T zrQidhQ$U8LCgv7{jSA6ZzQtM$T1$6}t+*s5zqI5Qds1l{XgiuFbI~(UaI+Sdq-5q5 zy#Td9d9lt=fd&a~aTS*)LHn||m@@ODSOY*CA){CVJOf;BamSYzB^Jbkw_)Al4N0vi z@$?Tb0&SBnDtZnYT>zc(tjQL|oSd5i?wH)-gg6&8=kp4r;5Eo8EFcTeIw?h<;o^&+ zR03Kp0h(9@ZA*r1Lk6+f7@5EeF@>05EcggEs7VYeLcj~kY$#e#7R;c@SM&x{4uR?r zkij4tWH>lgf`$}8)BW+_wM6ldm9mU}noPIYLGz-iiMh8}<3XN-&iR8PqbM~ox9B~{ z@8Av@m;m>nLG$x3KpqBX3r053(ji3fA{K6e#?wJA0l5N%!7c&qr2{S70u9wOf(~{D zFC_t=$IO_`RHOh(ktHlCOxa9DIyH>Jp#3P!cA$}V&@?NHA2^wT7x=#903`_4q7NV! zf_5SmeFR4lXmAKTt*6NZUJet*1sPNTjToax9Z1`2kWctP?gTG{f{f9yFjWa6B^f<% z!a*5a26+zbAy6QIrUEo!t0u6o!r_dMPX!%R8Xx}!WFaU#7#OQWku8C%fLjDo1;XG~ z9jILmnipLNU8@aV8BzrD0@SBPpp7qRUIZ<;0FAQ6$A3ezRs_x33eb`~lob)6)C2Y& z$W~B!mcf9aa)CIi3!uiu z$HTo23SW@d!Hxh8-9j7zTN1-`iv_g77aaT8*TocpmW=#DvJ%bHAnoz-ewv)%r2|FV zK#t!IB0$L-9IQoOLELX3;s=NT8Hg0Ta8H8s-E)vlpupl_+ryt_}6oWR$qay%SZ(6bp(xTCW6lq(*+$FjCx#+XBw!&0u6pc zX4o=|6+lP5fUko9@5RpqodgA%L{CjYntnq%tQRzv2b#IbFV=(227(7`i_#L4Q$b^! z;L9c8r_?}>jsfj_gWTu=b|UONVeqsPXyG%OJjfW($UA7>D8C3c*9c#U4U#Sb9WtDP zYEV&rStjUsO|XfXkke6%ONx*uE0J8Sqkzpou#-T`xgdv>#K%|Zr&b`^4N$W{0f=N2 zG>mn?Cni^!!!=ab>cz*y3)mjQW^RA+41ova7QpzNg_D{RTXAc0lLB=B|kYn z{uXm$Qt~anL}(1na&V7CGqs2rbo?|6hyc%_f;M#*m4Mns zB1xs0IVG8Sutk@kiTC0tws81ZJ-7r_+WAH`OQV3GibqQ1A*&I$ew!8X$#bS0b0OPa zz&otL`-;K4Yr(rj!8;(qoA2SdJIx53?e}N3UC7eQM`d0O}CgGot(kx6kDRc#bE=9 zb~{iyFRo)`U|?Ye9oWRd#Kz3S$OGDU&&0vZ!2xP=gSN1NSL`$LF|sjoFoBPI2XD^- z6|G#1pk;5MLKk$XHfT~6w512Mw;!ZV0Mz1Q;$qZbW?}}N0l>k+25!oOR@URfpyC=- zc;iwj!U&ZW!)*fS$SEd9CN_}USXj9fIK()l1emz$8F;yvWSE2uI4roBLDRqjj9g3{ z>>L~%?BJEioMKE|3S7E8OakT*Sw7Gn0Put{=!knRkZO50MkZ!1(1I5xHbxFM(76WS z5MttD<6`2F<6>lDmSbXJg{vU|{&lY#eQ7!@%$u#DQTo1_lNP1_p-WI7SAB6ox2<6vimV6s9Pq6vim# z6y_+F6qYE~6xJxV6t*b#6!s{N6pj?O9L^|CFwGUk1*W;9xWP0}6i*6A3TF;a2tx{2 z3U>-m3U3Nu3V(_~ieQRRig1cZifD>hig=1die!pZigb!hifoEpihPPfieidVigJod zifW2lih7Dhie`#digt=lif)QtihjCU6mN<_ieU>w6km!_3Req56n~0w3U>=blt79} z3Qr3|lwgW!3SSFDlu(LU3V#bjlyE9fmPi&us&G6*ig^le3qzD>ibaY*3qzDxie-vm z3qzE6idBku3qzDdigk))3qzD-icN}43qzDtifxK)3qzE23R|K~3R|LVid~9a3qzD# zihYWF3qzEAibIM*3qzDbierjS3qzD*ic^Yn3qzDrDp!_ric22A!h5S5)fc)aj3Wb8il8n5> z+|*({E-uf!;*!+F6ovdWh0NT7{GyV~ymW<2Qw{9-+j`FaWpAsML(N>Hwn0?0yzOpsoM#GK5;VuiH) zBCthVxe$xs&MU4gE=kQTwgx#kza%5INC7IMppmMVuBYIen5?4^o|%`DUtX-K!v(cL zp`a+gEHfpwSfL~%RiQXBHx=3MnRyC{3b~1Sc_7mYQj;^&GLscb@)b%l5=*!WauQ3@ z@{4kHz#c<(V@bY3Vjjc|P**~nkeiqc@}!PJUI~cS)Z^j`&Ij3;2KJIda$=rBVsc4o zVopw_LQ<+iX>n>=X%5IkdHH#|kXV3usw6*OM*-w9E>MW%Cgx=pl;(h=3=}CK&w#7| z2VZi2Zb5!tYF-IQCN#*WSdZ%#qh1x0p58A;{a=h$ReVhER@7v?#i(_QBQL)wH#xC5^%iSpabi;OEtahO%)DD%#RWN;B`HOjWvRDV z!R%WcU@EnuM^S2G z4p@m)acKc4yA;Ql=4B@5r=-S%tOA8g@h$eEREQ!jXb2^iWF#|!!k>YG0Yo!1FfcfS zN<%RQ28I%b8io?aW~L&(6vkkN6sBN?6oz01O=iE(Af@_6ObiSRnoPI2GK(|wic1pn zl2dQ7CRLWC7HcxzVgb2jB}0)W0|Udabp6oc)S_bj{G80P%+#WS#G;bayyEOi{eYtU z^rFPvV*P;1l8pR3{h-u>{Nl`#{Gv)-BLhQA{gBk0)RM}ARQE zF954I)-%@!X{Z2MrdLpTiz7ZgwIsecwE$#oF&oHZj9iQ?OhwuZ3=Ak9Wr2BA5A4we zj5Q1k8EY9zm}(eGm`hmFn3|c2wMtl17#FbBFl4c3aV%tPW^7`t0R;e4m6>0DQEp;R zW>u;JD7AtTJ;({5K-N=G@JK9H$jetqO-oBnE>S4WOGzz)ly6l=u=K5=sgPKdUYZNa zF}bD1C7`TWTvDWvU!(vIK^=v>{1OHA>RNS8&Rb0R#kbhfz$vK+R9zLRGcYjRVlFNz zy2Tk%S&-^lRFq$Iiw#szB$nLbjE_&wNh~gokH5tc9}jX;d^{+36@%jfLTE8CFcg7; z#{?AD;L4GSi;<6!jgf~D9!#Lz* z6xEM1F}~aM1UgX7FTgeVo^zPd1gt5CR33yNL(63fMO5H zq3p0K8suUICN4$}gddk7VFe7r!b~4wK7RE)G&!N zFfvqllrWbtWHHt-HZ!>}#9Gv{)UYgIsbN~kSmam3Qp;RuRl{5qQ^UM~6)cuk!(78+ z&HxdwVX9#fXMpg+8NwOz^jH{5*h<(-IMSH2xr&xCGJs$SXBJlqa}7fpQw`%hralHn zh9-tchCHSSh8pHz22GZ#XI}Z4c?u=v`JkxJ%`Zv?2OB8X6yRlQv5rD!UU4d<22|Hq zR{*82)YO#J6g@5l1qB7qG=;>xN`!iFpyw$hLc<+wqK-mhPL4uBQEFLcerYjS2%(`E zY)pA(P7Wv?reqc;Cl-NBS5R=wQ%KD%D5+G)Nh~f=0A*YSu(G1m;?kTF1#smBO8JoL z3gnp7yp&=EP>d=hDio&{Bo-x>;ivy$^q`62R zl*IWQOG=6|lS)gVNu0+CRJw#G7UgB;rQhOCPt8j$$^_SUw*=yoGg6bY;}eV0<3S}x zu_o&+#>88U1x4T#r2#UIF$t2Wz{v}o1wiic2BjPYP*K4ON?9z7OpGjy0*pe8T#Rgt ze2iR7B8(!8Lg;A@83Qw=2DG1M?YQXmsUEpshP4RcXM z4RZ}+2}=!gGouJYHkiMF6_lxJnL+6-jR{obRy72Jsz3!ut^y?wJq3lJ)RNMoykdot z(t?~+1tpD))Wj4Wg_6X~98D!qJ}gRAPy+Fk6fz+(oLZJzR9TV%YDgufm4F&a8L0|s znR$sh3dK2z#Tj}E3a**p+zXEB+(d8_0h|EzUV_SeKTS6D$YU)^%gjr;#hjCxcZ;p4 zxTGkvK$Eq|29%9KA%BZ8^A-!pVYgU7PC<_VP}a==MF1Zt0+>M&z{e=XD8k5v$l{}GGib8< z6{#{XFn}vBJ#gh!1o9J#m*B-~ktHa_aK^)$8Jf%pKNZP?dEz>6jZXq0=QN4Y{~UP-mF9smRmaxN%07I~rNRWESez_^eRBn$SYF0wZv zJ(T<+i9m<94VI4gl` zNj^p%)T{)m(m_!S(q9ZJaVz=Y(a0FikSD>yP{LHgoW_*RRip;0zZe-nO}_{RaAso6 zVgpz8OjT;Qs(OXu%G{*FfcJO@-YfAvLT`ul)pgn4)z|% z5QO&_K~=N}$a~pbMM}tC1GQ^4nX8VC|&A-yNe;3JZK?U=P zq?X+R(V2PqnjGLjzr|E+2<}j&=9S!HDmIE@Nl7g;1d~QlESY)vhG5bNJ#vH@7#Q|} zA_vqrfFv_MCN^dsMiwS6Mjmj^0wp~@Mm8okMm9zcMixdG4Ua%jE`vv)1S6<3gM zD=jHdrIp8$!US$evw-USVjWNqqlC4F0TeMc3=7z5m{OP*GJ(pM6qam;qJR>1upDy@ za|&}dQ&C3>YY9UZM>cy=O$rNWU<%xZ8zWmaT-Th7IhZ4JEuaY$@!`Otoy4d^Ic!_-fb|GS;#~69s=ZSJ5R%q5!!v zf}w^TWIm|m1nd4%!mvP~hIJuhEo%x#Ek_utO1J`PGpboV{a(-TMNl|Gscz{R`+{Oiq=NBocc=-Feg4(#H zdD(gS<#{^b)@w>WsLKRu+vtI7__|+=b>QL^-15A|0@CDni`6mM+0zr;4gj|RG=(6k z4csR|RQ{l%5!`3I#R6*GfQ#Z=?5TNWnML_|x0nmcQ^11>1?8ogDYw|tQ%g!SQ=-@k z%HvZqi;6(01}dGGn0t%EJGByA>fPc6&)LSf|)?O5AL3wIkNfb*_em+LAD8j(N@B)-xL9H%OrOgFycyKYYFmf>R zFmiw)sA(m{#KQy<0X0sbDVUKB+*AQIRFEorP%R2iy)oERZ&(Ur4MR42kpd_!l&}`F@dv&F$-h@R|yx`1g=`<6z*D<5{4}9TGkY%TDFQqHB2=OHEhjHwd^(Q z#mfR1YSq%bXHjA5!}tL3O+U%;Efvyictvxaj4Uk&p@#-e*QoD2ACSRgFW;4COD z)^b+r)v%^8XLC$oEMfwsVUQgq3=0HnI2STXg2n~7@;GW(Yd9qtYPrH0@}yW8N`$hx zCNRS4$Qq7Xwn&D;X%P%H3^g1nkX*%G1Il6G)Lz3S&QQxxA`H&CY&8ru+~y3m429Fe z89+YQueDN8H@XAYI>vc#fVJq3kONZLoJ z1!sc9qEv;P)HKkbLvlu9UV3T@Br~XhGl5?*sM?89(TFM6u8FCRj;oE;imBBEXP0U) zSqticffISsFGiIrK@7FO7^{CV)`IiZ%m4rX|JM}3mVa(>#+M})6%^&CC*5KyO1;Gn zYUyR>q!xuj3hUIwqU4NQ?CGf`i6tdPw>V&`i^4%kpQX4UF)xZWy(qsF(k(0kHTsL9 zL3%mTic?a-SttrrA%L1lnmpiqRFno10QDtqv4V#cZZW6krGQNYx0!A+=H6n=DvAM_ z!djM?Q<_@j0@49)`+^B@16Y)SfkBLsfuT46(jftt_Mk>Q2Y7e{#NuNDmH42%1*)<^ zB5aJHULz>KfpQfWqX;7pBNHPRqXZKVqW~ipm;~iJl-dE_4*h}A4h5H{YM|Ny)TK#b zu4PVPsb$F%NMWsIOkt~KN@1^MPT{C!sbQ#L%4RBZ0*xiqFn}t5NI6?n0O6%@iZCo> zg!8ySyyAis&RW(Q2529XEuEp3y&|ZF&4nS>tCpjNqlT#l)c#{DnpW6S!%@SM&0M^# zhP8NE4SUhH8up??HS8(ek_Cfh#?n9?8XbkyoXp(JyhQMLe@cF7 zQcfzQcbZzPqmWvXtOqW=KZByD$Q4xTK^hO>;`|l^xJw5bcYX;HehKQa6s3ULVVu|! zY7w}g2el?|u_YE1q=GuK1^ETwmW3vyd8D9&7YZaX76i~teCnIog5yS!|FfL{m zMj1vHa6gg@oS+041sHi4S-=>i2iI5~C|AIn_241RX2xQR66P9)5|(DBBDE5R1*{7h zY8mr5N*ETffmkK%HHV&Xs_27u=okSxj5y-=u z%(pmTR)LGKTTJ=c=!pf?ylnu53}^%dRJThoCW8_+DEWiZEol4`+)0oD*V51ddx;dr zTILj{T9y=0J+oURT2b5(kwv*=$AEYM5#`BpGTMY8X-& zvN?-R6xx-r)^LEvWK%dmLm{96oEi=r22jhlgku3GsKlvZ0>?1}sBWLYSj+*ogRz+j zq61Vef^-zxfoj+kPLL^@T#(@(j4}gWVt{Kkw-8M(L~{&|nC7{v`#}=hftb#3f5nYH>*vOL1yy9=Hf8k_4#*4f;UpAjbG8_Po?` zPP?^BN$j1b! zhCrnU6B7p$2O|d)6Ehzp2csBxD3gZ?Z0aqxl*FR)%)De!2?oeVXb9KVXI|MVXtMWVNBu3<|y*0VX9@! z;{xjijgBx@=B03grmag@L8)&68z_ajfciMBDcn$ThGx)Q3-dxousC=my@s`hEuE>E zv6-=!y@n;7v4p*bwVAPoU4lV`0o2({;Q*yyaRyMmRlKW)DVU*zvxcLOA((-Mp@gf1 zyM(8NH;pBmtLP1+*HXf_fIo!?G$^=`88H%{0_uhERw+YEh(v{=RM0GES*k)=YEf|} zXsQ}EW>Y1Ymk%j4;H3pPJ%OtvXfGC=p1`#cs2cKv*ZH8(2IbsfP@M&8vZpiDFvRkJ z+RH^OHH;IP3R!|7^JU;NK$Gbflb*pX#tJYGLVyy+FD{#$%;FMI#bS2_ls-V_vN2Ri zL#OuiY;y9G6LX5~^bqREcSBJVC}}o>2yoH_6Ch_4wJ;auKMODgu@Fko*K1@CT0z6g;6cQa!OPZJYlzNwudjWLBc1!Ni| zhcT9b%2>u)<`Pa&o&*i<)UsCSm2iP(B3u|^mB76y_8RsYmKrum(9Fc18s-$98gP%M zmNkH(a8Ecx4O7vp4#qsL4#pH7$h-z9FLp34;0BEYh(mHBC>Jt;`%5}dxAA51r|{P> zpw5V;@B}kx3RJncXO^Xc7DW`N7M7;wC8vUVL7-w1yilW9N1+Hd?U9kHkdvR64w`j@ zOlK<;mnP|gl8z`xP>|$f6l0!I@VAcgS ze?YUO#d6?6I#vwij1-0xMo=->!H~@q25NjWrGO`?{lN7ZxZr@f2sA!`;i6xhHlT^L zih?4$pD=f^FjUE6br(!!m8x@Mo_dKwZe|5yo)NP623mH4LcSQa^n-^Z$ob%K6su(f zr%Q$u#uknmaJqz)gPKezF#z&7I0j@G7#P4hML=E$m75))l!>+c1joWH#$-)KNZpGX z2Y+FHWn-w)#Oha25dtn|kxEjO-~>elLBoqwKm`^fgc2xf1r=_r;2FCjQ&8~*YCRO8 z4nN&uE>11E#hja&cZ)eUvEmkIYF=qBXt7i(dQl0Qq=J@+w^+d;9>oowv5E(Cz|EH; ze~>kSpq@1w#Gl~8u&5K{5;n*h8JM>aWhuB=1UVhFVyhU`0cQXgivo;%py5tXPlbtz zQHY6&QHGI^QGf|FK?-Vj2r=?7@-VV7i7@gpg0Lo|pQidP_W1ae{N(s}NJN0jX~-NJ zxY!28X^||*k)U)@1e%HkR~@&Qiz|yEqrV`3f(%K_$%&5#56ppAFF^bU8mIziydqE| zrpOIs5~vt10*zu7fu==@z>PJ~;71WC6%~PM-=Zv#x>OJW>hpuUDBxx}ctjb}P~w2C zzbaA!sRPv#;CKWF7ZL#qtXmv5x!~nub|6<2gN7$qSV5Hp5(c%%z=LrdOgxOB^%jsR zW)4O+W)5x+9u95}Sq?!CPA*msP7W>(J`OGp9u6%IZE*Et%Av-=&%w!I%*Di|2>>wm Bl->XU literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/random.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/random.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30be8a5caf47dd2c5101bcd54e1891e2ea385ebd GIT binary patch literal 19403 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

3Q!s<3S7Nd_14D3WK|y{|i9%X_ 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 GOBVp8)Nm;P literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/site.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/site.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81cc650bb9f48ac2748b11d27fee114c75db25da GIT binary patch literal 22143 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 WI0QIYIrup^IBYmn*_b&jxEKMGuBvGO literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c29ed9654735ca4fa636fc502175e9577fdd8dc GIT binary patch literal 15250 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bc8be9c5952d7937665cbc7a246194557f1bbed GIT binary patch literal 21404 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 H;arRW1P=Q^ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c48b328e61afe241cb07660f9d9e1b7e2434c21e GIT binary patch literal 22192 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/token.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fa879618a904207780df24960e67b496afeb2ea GIT binary patch literal 3646 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 RnE04Dm^qj^SU8-x7y;#|iuM2i literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bc7699bb8abfd795cd2c0a3876b28044091c5a0 GIT binary patch literal 17777 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/types.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5258d0a4cecbccf8eaf2b97ccaba9ce44adda00d GIT binary patch literal 9021 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 L$Y;f;%3%cn+GBx4 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc b/Teletype/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89f1a6f3b81f3f8d09a2854b76cc521f2827ccac GIT binary patch literal 13813 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 AAOHXW literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/_bootlocale.py b/Teletype/venv/lib/python3.7/_bootlocale.py new file mode 120000 index 0000000..8733e8b --- /dev/null +++ b/Teletype/venv/lib/python3.7/_bootlocale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_bootlocale.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/_collections_abc.py b/Teletype/venv/lib/python3.7/_collections_abc.py new file mode 120000 index 0000000..cb34966 --- /dev/null +++ b/Teletype/venv/lib/python3.7/_collections_abc.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_collections_abc.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/_dummy_thread.py b/Teletype/venv/lib/python3.7/_dummy_thread.py new file mode 120000 index 0000000..63a26d6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/_dummy_thread.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_dummy_thread.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/_weakrefset.py b/Teletype/venv/lib/python3.7/_weakrefset.py new file mode 120000 index 0000000..d4483c9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/_weakrefset.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_weakrefset.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/abc.py b/Teletype/venv/lib/python3.7/abc.py new file mode 120000 index 0000000..20c9262 --- /dev/null +++ b/Teletype/venv/lib/python3.7/abc.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/base64.py b/Teletype/venv/lib/python3.7/base64.py new file mode 120000 index 0000000..7e0108a --- /dev/null +++ b/Teletype/venv/lib/python3.7/base64.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/base64.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/bisect.py b/Teletype/venv/lib/python3.7/bisect.py new file mode 120000 index 0000000..8aaf050 --- /dev/null +++ b/Teletype/venv/lib/python3.7/bisect.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bisect.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/codecs.py b/Teletype/venv/lib/python3.7/codecs.py new file mode 120000 index 0000000..5457039 --- /dev/null +++ b/Teletype/venv/lib/python3.7/codecs.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/collections b/Teletype/venv/lib/python3.7/collections new file mode 120000 index 0000000..4d45338 --- /dev/null +++ b/Teletype/venv/lib/python3.7/collections @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/collections \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/config-3.7m-darwin b/Teletype/venv/lib/python3.7/config-3.7m-darwin new file mode 120000 index 0000000..fc21375 --- /dev/null +++ b/Teletype/venv/lib/python3.7/config-3.7m-darwin @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/copy.py b/Teletype/venv/lib/python3.7/copy.py new file mode 120000 index 0000000..e2ba31c --- /dev/null +++ b/Teletype/venv/lib/python3.7/copy.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/copy.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/copyreg.py b/Teletype/venv/lib/python3.7/copyreg.py new file mode 120000 index 0000000..4472527 --- /dev/null +++ b/Teletype/venv/lib/python3.7/copyreg.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/copyreg.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/distutils/__init__.py b/Teletype/venv/lib/python3.7/distutils/__init__.py new file mode 100644 index 0000000..59f55f1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/distutils/__init__.py @@ -0,0 +1,116 @@ +import imp +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/Teletype/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cad96b843086932c05d77da733888e156bb53ba GIT binary patch literal 2822 zcmZ?b<>g{vU|=}g*BP^kkAdMahy%kM3=9ko3=9m#^B5TzQW#Pga~Pr^G-DJan9mf& z1g4pzn87ql6iX^&7Hbw;6dQ9vmolYQaKhf zE@aGRDk@23UcjBgypWNRArH{AtV! zS)v3gxl#qP1fvAQ8S+F}7*d6@xr(+iGJs$tLmpEEL#jZQaFlQgLke4tNUmsEet7Ksj|(?Q8HjTxm=kjc}9j*nN<0BnN-m%g)GG=r4;TIo)(5E#Z*O* zNW5aISe9~>N{Vm_Zwg-vW0Y#DN|suxYP?#iYN}Yga;jLCdXz?rND6<7Knr7(W~xS( zTB>HeTB>HMSiE|wSe90lc8Xw%PzytpPO5g6TB=UGTB=T}SiDvWV=#lJ=u1$n`Q747 z$t*4@Ey>I&u1X5YNL47yEGj8Y%t_5FQ-I4T6eK2RC#I(=B$glUh<)kg8vnnpdWulbNJn09I(MXRZ&5J#aeGkB`sH%PfhH*DI(j5@ujv&;SKD z4=4^8xfnSZc^Czlq!_ED;11S9cdwr&%Po%h_`Jm2)cE*YT=DU_`6;D2AU02Yd|_!~ z4nziQIM_!>gct(@131>zLAHXD2nQpW4^IUw3=9k)3{C|(3=9k<3^feRjJ1pi+KS{32PQx4bws^ilnFsm0ZIcPnwf!t z0UZ1ipiIaJ&Vqa;3|XK^V5(uLVQgj!X3%8x(_}6Jd8$YdO(138M3gOQD~2$WEh zL2d&HfoOO#kpsK4NT`Mh>{cPLTbWA0ZmnTz29-4gT$_`bq{&!O33C?90@f17EH+TlRm)Vu zUc*?z(acn2m%?1bn9W{fSHo1pn8IuWDhfezoXt!{Q7Ozd4B2c&Q8kP;OzDi`47H5V zq+A3FyeO8O%%tKdHXlzX7tbI~u3N&eh=L~Bvc#fda6I1P07X_>eo-zs0V5?{Py`o& znh&5_Ai1PSo`Hcullc})Vo`c=6eqZ>1DO)Vo|BmbDn%i&3yx=S6icE;F_Og@puhkn zB1qa4U=(8H0^=fmkR43mk{XoIKqWSmqkD@vGq(WZMv&H99Oa2cd6{|X#Zhee12Cg_*;CAB_&0fNu?#J zu0=)pMYp))R`_2amfT#XGx`?iU*wWi=;uC`A~CSks8QJp!{}= zJw84qKN;j1BqgAXp$Sp~O5nHnK{7~jTBHq<0>vLvIzS`_4jV{)VF!xRVo)aMU<5-} z4kivJ2}T7*9wr_}2_`0R`NYP^#w5VR#K-|Et5|s$d6)#ac$nB&IG8#3Iat`3x!5=u M*_aSC2R8>J0KDwqKL7v# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/distutils/distutils.cfg b/Teletype/venv/lib/python3.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/Teletype/venv/lib/python3.7/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/Teletype/venv/lib/python3.7/encodings b/Teletype/venv/lib/python3.7/encodings new file mode 120000 index 0000000..8ab7b15 --- /dev/null +++ b/Teletype/venv/lib/python3.7/encodings @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/enum.py b/Teletype/venv/lib/python3.7/enum.py new file mode 120000 index 0000000..ec26698 --- /dev/null +++ b/Teletype/venv/lib/python3.7/enum.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/fnmatch.py b/Teletype/venv/lib/python3.7/fnmatch.py new file mode 120000 index 0000000..7d0781e --- /dev/null +++ b/Teletype/venv/lib/python3.7/fnmatch.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/functools.py b/Teletype/venv/lib/python3.7/functools.py new file mode 120000 index 0000000..2b4de2e --- /dev/null +++ b/Teletype/venv/lib/python3.7/functools.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/functools.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/genericpath.py b/Teletype/venv/lib/python3.7/genericpath.py new file mode 120000 index 0000000..2ac8a86 --- /dev/null +++ b/Teletype/venv/lib/python3.7/genericpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/hashlib.py b/Teletype/venv/lib/python3.7/hashlib.py new file mode 120000 index 0000000..0cec56f --- /dev/null +++ b/Teletype/venv/lib/python3.7/hashlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/heapq.py b/Teletype/venv/lib/python3.7/heapq.py new file mode 120000 index 0000000..667ad79 --- /dev/null +++ b/Teletype/venv/lib/python3.7/heapq.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/heapq.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/hmac.py b/Teletype/venv/lib/python3.7/hmac.py new file mode 120000 index 0000000..1f49c56 --- /dev/null +++ b/Teletype/venv/lib/python3.7/hmac.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hmac.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/imp.py b/Teletype/venv/lib/python3.7/imp.py new file mode 120000 index 0000000..b468739 --- /dev/null +++ b/Teletype/venv/lib/python3.7/imp.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/imp.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/importlib b/Teletype/venv/lib/python3.7/importlib new file mode 120000 index 0000000..0c6a88f --- /dev/null +++ b/Teletype/venv/lib/python3.7/importlib @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/io.py b/Teletype/venv/lib/python3.7/io.py new file mode 120000 index 0000000..43f630b --- /dev/null +++ b/Teletype/venv/lib/python3.7/io.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/keyword.py b/Teletype/venv/lib/python3.7/keyword.py new file mode 120000 index 0000000..5adf06b --- /dev/null +++ b/Teletype/venv/lib/python3.7/keyword.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/keyword.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/lib-dynload b/Teletype/venv/lib/python3.7/lib-dynload new file mode 120000 index 0000000..2f180d9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/lib-dynload @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/linecache.py b/Teletype/venv/lib/python3.7/linecache.py new file mode 120000 index 0000000..538b638 --- /dev/null +++ b/Teletype/venv/lib/python3.7/linecache.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/linecache.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/locale.py b/Teletype/venv/lib/python3.7/locale.py new file mode 120000 index 0000000..2fed2c1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/locale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/no-global-site-packages.txt b/Teletype/venv/lib/python3.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/ntpath.py b/Teletype/venv/lib/python3.7/ntpath.py new file mode 120000 index 0000000..4e91922 --- /dev/null +++ b/Teletype/venv/lib/python3.7/ntpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/operator.py b/Teletype/venv/lib/python3.7/operator.py new file mode 120000 index 0000000..bd7fe66 --- /dev/null +++ b/Teletype/venv/lib/python3.7/operator.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/operator.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/orig-prefix.txt b/Teletype/venv/lib/python3.7/orig-prefix.txt new file mode 100644 index 0000000..84e29de --- /dev/null +++ b/Teletype/venv/lib/python3.7/orig-prefix.txt @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7 \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/os.py b/Teletype/venv/lib/python3.7/os.py new file mode 120000 index 0000000..f6a3ca4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/os.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/posixpath.py b/Teletype/venv/lib/python3.7/posixpath.py new file mode 120000 index 0000000..58c6b83 --- /dev/null +++ b/Teletype/venv/lib/python3.7/posixpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/random.py b/Teletype/venv/lib/python3.7/random.py new file mode 120000 index 0000000..c21ab76 --- /dev/null +++ b/Teletype/venv/lib/python3.7/random.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/re.py b/Teletype/venv/lib/python3.7/re.py new file mode 120000 index 0000000..7d2707d --- /dev/null +++ b/Teletype/venv/lib/python3.7/re.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/readline.so b/Teletype/venv/lib/python3.7/readline.so new file mode 120000 index 0000000..726f8d1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/readline.so @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/reprlib.py b/Teletype/venv/lib/python3.7/reprlib.py new file mode 120000 index 0000000..f98535a --- /dev/null +++ b/Teletype/venv/lib/python3.7/reprlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/rlcompleter.py b/Teletype/venv/lib/python3.7/rlcompleter.py new file mode 120000 index 0000000..c4edf48 --- /dev/null +++ b/Teletype/venv/lib/python3.7/rlcompleter.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/shutil.py b/Teletype/venv/lib/python3.7/shutil.py new file mode 120000 index 0000000..11c4205 --- /dev/null +++ b/Teletype/venv/lib/python3.7/shutil.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/shutil.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..058e7b515e284c1777bc31c1c3b2ee0c3bc76c11 GIT binary patch literal 333 zcmZ?b<>g{vU|`Vf?~JKqU|@I*;=nKy0|SEt0|P^`5(5K63PTh_Dq{*`HdB#Y3R4Pm z4pT036f+}3DswXfBSQ*HFoPy*m2^;Pomn9bIr{(9Qq!tzH8yV{xo0*xF zTa;Lu7w5&NSQzD6rdXPq7@L+G7#J9&7wCuR7i1RbLXFk6Fv!i$$TrH+N7%2AY_DEH b=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ +* `Release notes`_ + +If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Dev mailing list`_ +* `Dev IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _package installer: https://packaging.python.org/en/latest/current/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _GitHub page: https://github.com/pypa/pip +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _User IRC: https://webchat.freenode.net/?channels=%23pypa +.. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/RECORD b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/RECORD new file mode 100644 index 0000000..2bd57e5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/RECORD @@ -0,0 +1,620 @@ +../../../bin/pip,sha256=7iyz5uyPMCgDDuzybTMlzoHi0YzW88e8HU_GYwnC5HU,283 +../../../bin/pip3,sha256=7iyz5uyPMCgDDuzybTMlzoHi0YzW88e8HU_GYwnC5HU,283 +../../../bin/pip3.7,sha256=7iyz5uyPMCgDDuzybTMlzoHi0YzW88e8HU_GYwnC5HU,283 +pip-19.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-19.0.3.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-19.0.3.dist-info/METADATA,sha256=UFkQ3jmvF9jPeZVMc6IScYpjOYGZx-05u0kqWTl8MnY,2892 +pip-19.0.3.dist-info/RECORD,, +pip-19.0.3.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +pip-19.0.3.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 +pip-19.0.3.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=_0sfqHzmBOW_4x3-R2jxH4luuX5Ffe32B7BaisaO2XI,23 +pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 +pip/__pycache__/__init__.cpython-37.pyc,, +pip/__pycache__/__main__.cpython-37.pyc,, +pip/_internal/__init__.py,sha256=b0jSFCCViGhB1RWni35_NMkH3Y-mbZrV648DGMagDjs,2869 +pip/_internal/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/__pycache__/build_env.cpython-37.pyc,, +pip/_internal/__pycache__/cache.cpython-37.pyc,, +pip/_internal/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/__pycache__/download.cpython-37.pyc,, +pip/_internal/__pycache__/exceptions.cpython-37.pyc,, +pip/_internal/__pycache__/index.cpython-37.pyc,, +pip/_internal/__pycache__/locations.cpython-37.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-37.pyc,, +pip/_internal/__pycache__/pyproject.cpython-37.pyc,, +pip/_internal/__pycache__/resolve.cpython-37.pyc,, +pip/_internal/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/build_env.py,sha256=M6gja0toc36njmTGewkXMx0A-ZiaG6kL3yIw-N8Eu9M,7439 +pip/_internal/cache.py,sha256=WfnnzjrXNi5-i1Ahy6UZWLs2LxSKAY5Sswri3z-pf68,7684 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-37.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-37.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 +pip/_internal/cli/base_command.py,sha256=YymFGRVq-Z0RcOyV5YzcRDANLeV19Em4XkipwBFqkEU,12725 +pip/_internal/cli/cmdoptions.py,sha256=pZQFNv-E7S0k4IYm6MW127FfLO0RP4yKkfyfb3V_x90,23885 +pip/_internal/cli/main_parser.py,sha256=ReG-nZ95-7WxZJLY1wrwknPGbECOd-zkUnHiShKr5ZY,3016 +pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/commands/__init__.py,sha256=CQAzhVx9ViPtqLNUvAeqnKj5iWfFEcqMx5RlZWjJ30c,2251 +pip/_internal/commands/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/commands/__pycache__/check.cpython-37.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-37.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/commands/__pycache__/download.cpython-37.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-37.pyc,, +pip/_internal/commands/__pycache__/help.cpython-37.pyc,, +pip/_internal/commands/__pycache__/install.cpython-37.pyc,, +pip/_internal/commands/__pycache__/list.cpython-37.pyc,, +pip/_internal/commands/__pycache__/search.cpython-37.pyc,, +pip/_internal/commands/__pycache__/show.cpython-37.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/commands/check.py,sha256=liigNVif0iz2mBfhvsajrLZT5zM5KIvgmKvhAW91EzA,1430 +pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 +pip/_internal/commands/configuration.py,sha256=265HWuUxPggCNcIeWHA3p-LDDiRVnexwFgwmHGgWOHY,7125 +pip/_internal/commands/download.py,sha256=XPe3Kuj9iZfXwOiJq70mYVYNZD5lJCLnGT_C61cOsKw,6623 +pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 +pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 +pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 +pip/_internal/commands/install.py,sha256=OqLybBwThV0IRq0xwnlsENWBB9-hw8Dcv5pUPg5QtKw,22580 +pip/_internal/commands/list.py,sha256=cbJEvxkBlFfSjBalQrbTqb_KFR6eLMo7Mp_JXttPyQI,10150 +pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 +pip/_internal/commands/show.py,sha256=9EVh86vY0NZdlhT-wsuV-zq_MAV6qqV4S1Akn3wkUuw,6289 +pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 +pip/_internal/commands/wheel.py,sha256=7MNPZqK9WWxZC3TgzvMBH-RPRlOFLpwq927lkzUiUjI,7167 +pip/_internal/configuration.py,sha256=KMgG3ufFrUKX_QESi2cMVvFi47tl845Bg1ZkNthlWik,13243 +pip/_internal/download.py,sha256=KoQvMd0OfeMUn-Wi_v2e99jxkue_zKkxFBHiiQDS3Z0,34696 +pip/_internal/exceptions.py,sha256=bRSURPPUs2wMBb2TillETj6EBTDgpp4fWp5CcKZe3K0,9145 +pip/_internal/index.py,sha256=sYBuVbKkl11YqinxBIxro8_tx0GQ_5n4gbx9EpS3xN0,37840 +pip/_internal/locations.py,sha256=1JWExRYwqJq6slzprUVq0u2nxTzmGem-8L1CxU0tdVs,6944 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-37.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-37.pyc,, +pip/_internal/models/__pycache__/index.cpython-37.pyc,, +pip/_internal/models/__pycache__/link.cpython-37.pyc,, +pip/_internal/models/candidate.py,sha256=avICbDUtLA5zIwX_Xy4z3-Qg6tf_ysZzz30sdFbVnys,1094 +pip/_internal/models/format_control.py,sha256=p0L8487xgkUrGyvULKCBQcJW0uZbWeP3ZXE_eGBGfe8,2264 +pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 +pip/_internal/models/link.py,sha256=mQu9rcPjaRGSqsboFLAdgMRT6B6iatiiCoToNHv4zS4,4817 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/operations/__pycache__/check.cpython-37.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-37.pyc,, +pip/_internal/operations/check.py,sha256=KND1M5Bh_zMBP9hvvSovZPwolTxH3sWGiHD6hABegs8,5137 +pip/_internal/operations/freeze.py,sha256=To8UFKGiZIOfA87Y1S-7HVn_-cKjRYXJ4X45maMWA-c,9321 +pip/_internal/operations/prepare.py,sha256=l2SemS5Z_KYB0PQ7y2E12Yl28-rfegcmSRbqvElsQpI,16740 +pip/_internal/pep425tags.py,sha256=t0VKiMvgd1VYcTdJe4H_6_VYeCB6PMDwnqZrE69FYH0,13142 +pip/_internal/pyproject.py,sha256=nBCBkD95mF2BoYTOjyfS0zccTjYPgIUWM-NB9pOBgbM,6478 +pip/_internal/req/__init__.py,sha256=gneiGyc-U5QXYi2XN0q9QzcQ2TK3R7vwQ4AzTmk9rIk,2343 +pip/_internal/req/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc,, +pip/_internal/req/constructors.py,sha256=bMUEADysJNU7rnXK_k4OqpNXGMWFkE6b3JjqFULf0GU,11378 +pip/_internal/req/req_file.py,sha256=Onq9xqes1R1qptlkAUOhlvGO2JZLvVvOBA7aO72YIfc,13730 +pip/_internal/req/req_install.py,sha256=BXrpciRx6_Ah1OfeYHQt_8BKUgpRpgRPqOT0LobMsD8,39955 +pip/_internal/req/req_set.py,sha256=dwaxSEGvtFV4G6uW1dNLbfpV9xbPBBdDbHslR1FN7jc,8064 +pip/_internal/req/req_tracker.py,sha256=aAvF76NrFVc0SmOtj3Ee570i9g5yJbxv0uJsBxumbG8,2905 +pip/_internal/req/req_uninstall.py,sha256=OaIJ6Hdo-LJ27LU2cAPWzHfbl_3iobsGzay9wDlfLpk,21458 +pip/_internal/resolve.py,sha256=whoi0DJIk0B-j_W6wLkosFwcMKCImanHnpZKeYd-X9U,15226 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-37.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-37.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-37.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-37.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-37.pyc,, +pip/_internal/utils/__pycache__/models.cpython-37.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-37.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-37.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-37.pyc,, +pip/_internal/utils/appdirs.py,sha256=d_iHU6K5MlL2Dq82QVtZgFXpyfrrDuDwuCmiI5H9tQ0,9435 +pip/_internal/utils/compat.py,sha256=AEVxz_VJCAVl2HoW0s3H07QXPG_xj_HfMGVws-mB9n8,8565 +pip/_internal/utils/deprecation.py,sha256=MF43y-bB3N2foClmZUdfBtUsfAOz8Bdck1EzRy5RVe4,3044 +pip/_internal/utils/encoding.py,sha256=jsXgq7MlYmX_fB9yqzC54H2SpPfQbzYfMXrx8PT15R4,1225 +pip/_internal/utils/filesystem.py,sha256=ojaIDvOFOtkpKme5se6X2N8ARmQxu8cxvaaI-NFqVtk,990 +pip/_internal/utils/glibc.py,sha256=lxM6vJc-nUhUX3Dc1UOFlNBdjCylo-9Ta6c536uyvSA,3296 +pip/_internal/utils/hashes.py,sha256=FMYKr_y6NAalGcjOkN5dgM91vVhm3J-hCAc70SCQPO8,3569 +pip/_internal/utils/logging.py,sha256=VjAGhQKvmuN3tUplwamHGVMQfZoBefGI7GtvlQDLW2g,9719 +pip/_internal/utils/misc.py,sha256=-4KcZiJ8ErnLzOZDYm6bCj-KwB-MbxJZbnTDxqT3eF4,33547 +pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 +pip/_internal/utils/outdated.py,sha256=vnSpakXMU3lFiFxyX3stWzTyu2OnWGG8KA2rdOlcrBY,5974 +pip/_internal/utils/packaging.py,sha256=cDVTZVp3eR2MQX45DYlkzGyHP6zcF45ujm5oCAoA230,2785 +pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/_internal/utils/temp_dir.py,sha256=0Xq5ZlOd2OOeHwKM6hGy66gnMGAbyhio7DtjLHd7DFg,5339 +pip/_internal/utils/typing.py,sha256=ztYtZAcqjCYDwP-WlF6EiAAskAsZBMMXtuqvfgZIlgQ,1139 +pip/_internal/utils/ui.py,sha256=l4CEswlh8fWvISW4-RUtlXtw2hFvko08OZBYCWBTxSw,14256 +pip/_internal/vcs/__init__.py,sha256=O1rQ5XoDr4r38kKktwuCL3SNU2h0WGjB-lVHjPuY-pw,17278 +pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc,, +pip/_internal/vcs/bazaar.py,sha256=AqsBYeXjl5Zw8IaoIVI8WStDE6_UqZ1RTfvVH5qZkG4,3670 +pip/_internal/vcs/git.py,sha256=zO-_jOa7baD_Y6y_zDFQVhYSvc1jgnDEA307y9LATAA,13407 +pip/_internal/vcs/mercurial.py,sha256=aAxoCGfLjHcxZtN7FSvFL28MwLOUL0dZzUssZ0IU__g,3447 +pip/_internal/vcs/subversion.py,sha256=hxFLX0Ncdth7dY7excIdFo6UGQrjuZ6KIeIL3jqr-3o,7081 +pip/_internal/wheel.py,sha256=110d-8C4sg_RmZHw-bVAPvHiAiF9TAhZJXo9tvN1PIk,41001 +pip/_vendor/__init__.py,sha256=vsMCQHIwFuzqN63uGhBNE0zimx6rlZl3SC-m7YHmjG0,4779 +pip/_vendor/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pip/_vendor/__pycache__/distro.cpython-37.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-37.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pip/_vendor/__pycache__/retrying.cpython-37.pyc,, +pip/_vendor/__pycache__/six.cpython-37.pyc,, +pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 +pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 +pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 +pip/_vendor/certifi/__init__.py,sha256=timLpLv3BNcGLLEz2s6gyA34hOhMb4AIPBz0zxOxna8,52 +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-37.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=zGy4Y1gu9Zy-6CGvg3apdC7kXMm3f1ELolJwNDnBRv0,275834 +pip/_vendor/certifi/core.py,sha256=K_VfM6GwSemTFisUgFWyk__w1m9pCGFRF5zTzO5bGv0,288 +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-37.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/colorama/__init__.py,sha256=lJdY6COz9uM_pXwuk9oLr0fp8H8q2RrUqN16GKabvq4,239 +pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/distlib/__init__.py,sha256=7uthK6m96pTekk8hjlT-MybcwYmmxwP8gEOxXVg1f2s,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/database.py,sha256=-KJH63AJ7hqjLtGCwOTrionhKr2Vsytdwkjyo8UdEco,51029 +pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 +pip/_vendor/distlib/locators.py,sha256=S9G2IsZp0RnMMbXGrT-gu7892pNpy1XMlUEuUHX3OI8,51828 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/metadata.py,sha256=BNCnpRfFVslyZcosr4vnE_YbkRb3TNxXtk7TrDszJdc,40172 +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/scripts.py,sha256=NYqRJ2uuEuJwr_NNLzWH0m_s_YsobDFQb6HqxuQ2Sew,16638 +pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 +pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 +pip/_vendor/distlib/util.py,sha256=gwKL5geJKmtR4GeIUnoMAWjsPPG3tVP_mFxw_Sx-isc,59681 +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 +pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 +pip/_vendor/distlib/wheel.py,sha256=gV53KDG7BgbxsdeKjnATbP47gTEJRNylcIeE1TFin1o,39880 +pip/_vendor/distro.py,sha256=dOMrjIXv-3GmEbtP-NJc057Sv19P7ZAdke-v0TBeNio,42455 +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 +pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 +pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 +pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 +pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 +pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 +pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 +pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 +pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 +pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc,, +pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 +pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 +pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 +pip/_vendor/packaging/__about__.py,sha256=Wg0-hNgTU2_lBZcGBh5pm1R9yroQ3rv-X0rig8KjA6o,744 +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pip/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865 +pip/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416 +pip/_vendor/packaging/markers.py,sha256=-QjvJkhSJBxBogO9J_EpPQudHaaLV3rgVYsBDqn-ZLc,8234 +pip/_vendor/packaging/requirements.py,sha256=grcnFU8x7KD230JaFLXtWl3VClLuOmsOy4c-m55tOWs,4700 +pip/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778 +pip/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520 +pip/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978 +pip/_vendor/pep517/__init__.py,sha256=nOY747zTld3oTdEetBG6DWxEcZXTeOQk0aHvbR-sa5w,84 +pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/build.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=xMY2kLutkjCti5WqTmKOLRRL3o8Ds_k-fObFyuMv1tk,6061 +pip/_vendor/pep517/build.py,sha256=-n8PT-ugS1TdqoTUY1vatDQjrLtx48K_-Quu2MuQBiA,2699 +pip/_vendor/pep517/check.py,sha256=Lu7nMdYu1JVV58fE3hv-d_avTy5h0yO9LsIzAt82Clk,5885 +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 +pip/_vendor/pep517/envbuild.py,sha256=9-u4KffexPMEm52rTaIjEOxsCAd2DMByxzv5H566QLw,5763 +pip/_vendor/pep517/wrappers.py,sha256=9dZn-q7F5KyQKUJMie2uKwur2FG0CLXz_kLZzkJOhZc,5912 +pip/_vendor/pkg_resources/__init__.py,sha256=JGk92Be39-a8sQIltjZF-Dk9ZOIAR0lpCZ9rYrGHfVM,104648 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/progress/__init__.py,sha256=Hv3Y8Hr6RyM34NdZkrZQWMURjS2h5sONRHJSvZXWZgQ,3188 +pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc,, +pip/_vendor/progress/bar.py,sha256=hlkDAEv9pRRiWqR5XL6vIAgMG4u_dBGEW_8klQhBRq0,2942 +pip/_vendor/progress/counter.py,sha256=XtBuZY4yYmr50E2A_fAzjWhm0IkwaVwxNsNVYDE7nsw,1528 +pip/_vendor/progress/helpers.py,sha256=6FsBLh_xUlKiVua-zZIutCjxth-IO8FtyUj6I2tx9fg,2952 +pip/_vendor/progress/spinner.py,sha256=m7bASI2GUbLFG-PbAefdHtrrWWlJLFhhSBbw70gp2TY,1439 +pip/_vendor/pyparsing.py,sha256=jh8A5pZOiogg5mR2riJEb2vlfKQ4grylOcYSmW2SU0s,243692 +pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 +pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc,, +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/parser.py,sha256=2tDXkldqPQJhyadXzL2rGhVbjUyBNeXXhaEfncHl2iQ,10326 +pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 +pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 +pip/_vendor/pytoml/writer.py,sha256=WbNNQg3sh_V-s3kt88LkNNbxEq6pPDdhRE-daJzArcI,3198 +pip/_vendor/requests/__init__.py,sha256=ZI8kbaEzLAxsqex3MmMPr-v24d1RfZbNAOY8fUxg2Xw,4074 +pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/api.py,sha256=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253 +pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/six.py,sha256=h9jch2pS86y4R36pKRS3LOYUCVFNIJMRwjZ4fJDtJ44,32452 +pip/_vendor/urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722 +pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746 +pip/_vendor/urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839 +pip/_vendor/urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VvDpkc5gf9dTXNxXmyG1mPdON_3DrYG_eW4uOqN98oQ,10938 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=-kI_9y99Iwybv6Wy8IF8PugVl61BeMBEEqGwrDYNCuc,15823 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456 +pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=E-9J-kAaUn76WMZ4PpzKUxM4C3yjY7mopOpbPIy3Dso,5700 +pip/_vendor/urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853 +pip/_vendor/urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991 +pip/_vendor/urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609 +pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639 +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +pip/_vendor/urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586 +pip/_vendor/urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105 +pip/_vendor/urllib3/util/ssl_.py,sha256=4qqBDM82bufhqqEd0b-99sObz95XmEVEXDVi5iAyCeE,13172 +pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +pip/_vendor/urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/WHEEL b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/entry_points.txt b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/entry_points.txt new file mode 100644 index 0000000..f5809cb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.7 = pip._internal:main + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/top_level.txt b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip-19.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/__init__.py new file mode 100644 index 0000000..f48c1ca --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "19.0.3" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/__main__.py b/Teletype/venv/lib/python3.7/site-packages/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# 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) + +from pip._internal import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bcce1101137935492fbdf2f0b68b35f221d8ac3 GIT binary patch literal 206 zcmZ?b<>g{vU|`Vf?~D;=U|@I*;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCQ}ugp{1UI zp0S@M<1Oy^__EZZ;>`TK`1q9!MNA9~5aL&&enC-YSz<}5epzCXep-G`N@`KDzLBxM zv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_Nn%cpu7yEvc1E^Q j4oDD;KX( literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64678e151d0941058e4f6abbabb47d77ac1f969b GIT binary patch literal 458 zcmZ?b<>g{vU|`Vf?~KW3Vqka-;=nK~0|SEt0|P^G76SuA3PTEG4nroef*CZ~UV>bp$#{!DF{wB|r?ezBJ~OufsD^4vcxy4(MS)do6nOBlpl$V%O z!~!yk6>JSiF-Q~0l+=pMl9dcaLJSNL;#Z=6K~ZK|Vo9ogSz?iXT7FJSYEiMik+Ht9 znVDI+MTw<(abA3ig;B0$ilwQEv1z%1fq_AKfqsa7L1uw&W?pegVor{(g+Xq1Mz&E7 sNDz!+9@HzSyv1RYo1apelWNBZiVpz>1_mA`4n__Z4ptFHJ|++w0CahPZ~y=R literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..276124d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__init__.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import warnings + +import sys + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + # Checks for OpenSSL 1.0.1 on MacOS + if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import commands_dict +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def main(args=None): + 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("ERROR: %s" % 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 = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) + return command.main(cmd_args) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a642b61c20db6106cbac7bc5fc136c60e4540af5 GIT binary patch literal 1850 zcmZ?b<>g{vU|`Vf?~F0!W?*;>;=nK`0|SEt0|P^`4I=|X3PTEG4nrR)ES?m$Y^I`Zsa#pSDeTz{McXO`QW#P= za`&QIcRbZ;n*1bd)rh&6gvSD;p)7D;Fh~D<37Fs}Q9C z7U$1l&sB_4WMoKXUZ9k!ypS2TNtBMQ<#DoG=*P+!c>#-7Jp(= zaehu|Noss%Zb5!giJvCpEkT#mg4Dc})V$=%@Wi6L%)InlY?qOQEGBxNoIbYCd)16 z^vsf5oVlq*$)!b^i8;5pic6EqQj3Z+^Yd=8B_&oRCW17HdFDaf5tLe3np#`}^*}Ns z$iEB>3~USx44?$&3`#~17#J987*ZIrIf}$e7_t~s7*iNpnIsu%8A_NIFoUA2gr%8* zk)cwcgtdmDnK6c`maoFUJPg`tEko2#gfk)f8Ek)cYbgdvN40Y?f`4YL@-LPkag z2)~3giwnYAz@5SfVugc}Dnl)E9diUIVK7B7R0@^wEZ{BS$>K|4UdRMaLs>Qb$s#HBe@tK*Iu8;}}Z3We0h4PHlJcZ)a zk`j<;PJVJ?PHGjGu5M;=eokUZDk!!%;B1jw%*B<(w^$O3(#wi?7#J9CiDl*$mn7!o z#Fs--Ongp$dU|S65eEYULlG$77IA}=u@#r3q!tz3Vl6MqEJ?k^lwW*{Jts3SwK%ol z7E5YHX2~r!h}E|^i&IOWOg10qct;5hylqvE(LZ=4rBl zT~vIFBRMxEJ})sh6~am^N-w^}oLZ55i!t>UJ2c6yWGK>NU|{%_tzS@-S(aFms$Z5^ zq@R|blag9gtZ!tjZ)|2}R&G&ZX3=9lWas`hRi-St zxQG`N2YeucA4CX%2tklnInz^1e84IH7Dqfd3C714DT1UyQ4daWNQ5>>3x`c^eoARh zsvRg|i$SS_hlzs`44F8%co_NEm>78&`54)lMHoQ|MTn7&iGzuU5e6j~d6>AE`IrF# Ch69fP literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8edf10d9c20b1cdf0ccc3eed7d43691a6ac378f8 GIT binary patch literal 7463 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ℑ2BCPe$O+U2Wk&LpH9Siq@+EV6YDqfWXRKA6 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2de8672793836d047e73198b4ee02e6f02e4a4e3 GIT binary patch literal 21179 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9759de31eb28301a552082c1635e53ed2d104ea GIT binary patch literal 11750 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5da029e6338e20974a07e340d25014ced2280988 GIT binary patch literal 25260 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbe519446d9077e0df123a7b477149164acd034 GIT binary patch literal 4437 zcmZ?b<>g{vU|`Vf?~GB9W?*;>;=nKm0|SEt0|P_xJSGN)6ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k@>O0!0>g86JwY+#x_iXBXIL~*1rrm*C2=5j=Ff%UTHaOd(w@qpQE zIlQ@iQG8%Fdk%lDK$JkPV3Z)3&ygdPD;y=v$dD>rv>=5sg)>JaS2RjAS1d{_S3F8Q zS0YLxS29YHks+0Dfm90DLdGcR6z(XQ6rL#A6y6lR7KSLf6#f)}7KSMK6u}gs7KSK= zRQYCxqDQIBS&9pkQrWYVQ-l{XMXBUjREj~xm=~xnWPpfM0@%85tQO8Sm48xfbXyWQfwL*Ncv?k^{29Dv8FJm$hI;`GNj05GfiMB ziU5Z+bBa7zOaUU6q8MeIqLiZC0*XCLQ0%!dG&4q7A#4Y`#~RA#TVMlH0~WJQQBP4# zQEOq0vP)qOX3*5AGWW?(PAtjH&ns3a&qyswRVYtY$jQ&oR!GY)Qb^9vOUq0z)=|jJ zD=taQ$x$dSDNRe$QAjOGehEtMnvA#j6O)Sbb4p86<1=#$@{3CRG#PJk7FQNSv}!Wm z;tqE9aP@VK_jZj8)?~cJo>)+jl37%&$#jc7+|$p+KRoyrS87E;VqQvVacYq!<1HcI z$biUrXAf6r@A#llKR-`DcTLt?%#L}Lw^&2-GV}9pvAAR=m)v6U$t*6p#o=E7a(!aX zE#`vEf~uV%8JWcjX_+~x3YoIQ#Nq$kKUP(nsG9xI!85kIt85kHi85kIxK}C!a0|P?|Ll)x# zrW%G4=7mhPj3q2Jj46!GO#K42Of^gkSWDPISuUI*g(;9Bh#`U@g(;Xplex;COF=%7HS?x)Fqiz&bO7E3{5NyaUfto+Qp zTT%g@0r4)bKCU6I@xG2h-mXFMZk|4_evZDbw^;HEQuA)HmV@lPC5o!Z*EKlU(cM*( z`4%VKqFWrGkO3Rc32{?=TER+&A}Iz2hF>}Q1x1-E2B*VbKkPPC&Fe@yk zw7@Y{0*;#^K2R)_FlI58Fqbf{Csd}&@vYEeAG3A&�auS~T#PJ?B8)6dMWAqkhYJ$}0|Pu< zoWS7%O2OcC%v{2f#k!DjA!98hU9;6Nq%eZhHG4Bdkrh}CM-Agb#v&_lSTP4PK*I}? zqS3-DGY=Fxsd;4ziFqjsdHD*(mBl5gxeCRgbYB3;)5Ut=5UP^S%hyfM$xlkm(FIBC z!lg?pNPsuFGOUzBZ#h#c{3{IjfAU(G@;^RSyHa@;c2&5L| z?OSY_#UL?FrdvE9HSxLmDe)mGg1PWVi zkb{_ui;}BsLo!koAb9~?$|M%0Dx_AVCYP3gQVS@HrxoSrDkLZ7fr26@KQBGCNFfQN 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 X%frOM$ic|LB)|j-EeU204i0Vr&8>}F literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be94167d78c83fe2dc559625dc8902a1c0cbe6d1 GIT binary patch literal 9104 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 W3lAd?BPe5lTKp0qF)$VYS1SNSs3{-- literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0fadc30416aeb90625dab89c679fac477aa721d GIT binary patch literal 25937 zcmZ?b<>g{vU|`Vf?~Ku0z`*br#DQTB1_lNP1_p-W6HE*YDGX5zDU2yhIgGhXQA~^= zHggVh6mtq=3Udxi6bqPUjba7UY*B1rnmvjgOmjqWf@!WOE-=j<#SNx;qIkeGZxk<> z=8NJ>VN7Ak;m;L_5&+x5nj@Gi6eR>^v*ifqibRQk+3Y!@xnfabU^YjNc&0=gG~|3amjU!as{)+bKG*>qujx4 zi5%Hnk0=i?TQbKp*DJ~^*E`A^%$LgX$@Pu$1+%4d{Br%H{K0IQoPgZGs6a-BRJ+um z6xlQ;NrtH46uGF7RQ3g-sbLElqry|O|eX|YGH^*;cV|ekO|ffXNU=-J zXl9Pe1eogu{| z#j}MW#S^SMKZQA%LDQ$ogDbeSpdi1fL?JD|NFg(?xFj(rCo?ZyAu%sSA*nPoCk4bQ z$w*aDD$htw%~4WF%FIhFs#GXQOwLYBPX%eqO)SyldI`!YnvA#j6O)Sbb4p86<1=$X z=K5(e-V!V=$|+7vON~!5GfB-$&QD3zWW2=|kXTflTBON%i?<*%ni(xRMOT%~y+mx9=u%(nzRAs$RD$;{7lEh@?{x+UV7SC*KQ znGz22om*y3D#-j>0-<@ukZ?(b$Y?U%k_zw)h<9=IaSd^e_jL^Nb`6Sm^Yn4`bM$q+ zC6JO?TvA$+nNu8JoScygb|H&TW?nYPb(wi7sd**wIr-_DEVuZR6LWIni%XLVit>|F zi;F=51tq0LsVVWrB`Nu(CAYXz^NLH0QsYxHi*9ijr6#7tCufxAWrG5SKiD-SG$6#^ z-zPXe*u&Eo6nG)2xdkqnMXAXp`9+nQjJJe*BLgDiojqKgz2k#I{ro)r+%*|*@#Ghz z=EWBmWaj0i7HM+dVsXh#F1f|xlUZDHi^IPF6ds8=w>W}R3rkb;l2dQ7`z96?Wag#c zVht%R$Vt7$VG?`v9GB7X{frw-#P=aJ&U;xo93=9m;pwe54 zfq|ifA&YSVQw>86<3gqd%phJCOA6ycreFq5Ccj^d`kJh_nDUEnv4E1%E%u_+92lb@ zCowto7ISfGfhN-}=HjB{TZ{!O8H&sq7#MzK=ob`amL-;?>X#)J>8IuAq@)%V>l+#C z8=IM#m0OfpniuEAr&t)}TBcZ8g&|g|mbHetgr$bHnbDk~ zmbr#$0c#EGLPkc0LbY&)aE26?K!zZO2!<5a61Ezq1?&qMni&^xq_8byT)>&azK~Iz zp_Z+Nt%R$FxtTEy6r>zgra`GCrA2uP8X1Yj89E9%sd?!o8JeJiLjmLsh0<~HITWmRrC7F4KzZh*bxo@#Ub>3ow zNZ(=sCG{dP1_p*(%sHufx7bPxQW8s2i_vtkHJnK~`N`QJJ8v;&++u?`_!eW@Emp8Zkqan|fnpsT^+gsSJ#0m(Aa}Tf z5}61nB_S!pO!1@?cQ}vX?+k0Aa9~WEdD2Y8VzUq%baI ztYxZUtYJ!FvSCPJT)ddw(;y*Vo>;7qoROH9o|>XpWDN=wP(v7Inp-ib_)%88#hO^0oSEr&i>W** zM3cA30F*(%S&1#P7!-rxM0bk=RGER3CRcF@C?Y^nS`-AzK3u64smY}!psM5+8>ESF zOEf*T1f;pRvbY3Pt0d=x+9J2uK_(QZ7TjV18F!1dyeP9IRg)Exb=iu+Er(m2X_-aE zB_Nfz*i$PYbvjE?YHVUzWrMs2svsCxc^G*ZIT*PZSr`QvMZkHOi&2D; zg|R4)fq|haB2L3Tzy_4E%2JE$U~D@*ZF@}(T@V)}4B~0pYl1@-lu&Wu7(GzaK^K%Y zRZt3VP+tU`k=o!HDTQevQ!P_PNeQU_VqD1R!VsHQ%Ur^|fTf0cA!98|4NH+k4a)-7 z6y}ADHB8w|MG_@!C5)id1}ZaBSQaujGxqD$vR0_nu(~kB%7BV$P%2!&wGdovr?6%- z6@`G(PGJbRuxE#)y+Vm_22iTfCh zNl|HPh@YD#cabqDae-18C?yn^fLcjBpdbX7Zt+E_w^(x%OOi8gv8EU0mll9i9yo0j z#egly$uCbWDslrAg6t4GIlu)4$Q*7^oW_GI@043CnI);YMa5uEU=_DmK4Qg09GDG0Y)xHAx1GqE^vAhV=SshE=OQhG^ofdK88|`6pLgsWHNv% zP*A>aX6(1AWh`N7W~gPVP^kgMy9~5yW?sMsDn%F>z-0_0s3a)V3J3AnK_w0&sLE!5 z#9|3Y7Uu#kP`Lq0DGRt$m@^p`GS#xyuq@zCVF9z*Qdm>iS{OPRN_g5C(il_NQ#e{U zYFHQWE@W_FXl86?tYwADaDrvnkYw0uSZmloF4pAoyT!-_u9R-^C+FuC=jWtCvsm#h z?)1`37$+H4pn_;nRTvBkJ5a@4!cYThS1^J)*$bH#Fo6W8`BLVFuL= zJWL#HQjAiJMU#>9GpM-@@)js!i-Q`)7O;YIBQu!I24=H>N@_`l1?-So9bED@6HMj0*%Hxww|KhP8MB$X)3SwQLo6 zHLMVs*rXVyTIO1Y5C6h3i=8io{JNd|GSsv5QhJSqGOglpJqm=`jEOQv<<3@HM&93?_EY|V@y zlP541S%B2la4Zl`5rnuoPXI0=1QAIQULaD#25vNpRLyfqElDlP&CCP0QWEnj6^g-i zez8JgQK~{-eu+YUolhkBI$}!-+UUFh_D!9TbG65AxOyKNyixHBF z!ATk11^LBglapColANDgV0Rppd_iRl8$*>T)MxRDN%^HEu(CHkFTW%{KQA5>P>6yG zVZtpIkPNtBgnI~-u0b9W2AQtLz`&3R@{n8%Q!QgH6T(v+4B6~OEHz9ujFXYP#f!TGXp+)fLJ!GLthDGK-PZqFz<1bADcNW=d+2LShQ29ShQ1k`GC!`9(UQ z7I$TSsX{?fYFcWMLP@>?X#A-twYXTJBqOs}0TdLOdFeU|rNyZVy1IG!x*!o|0i`0*TinU{IXS7xAZ^9BxKmQo5=(PR zK;Z%!;V41G)-Cpw%p!0B%aN2=3~5R;C#Iy_Vo%L0%Ph*zE9wGO2cXLG7CWe00cxAG zB^DH<=B0pR8r;G!N&ywKte`ek@h!IE{GyW7lp-gP7#k#uf}3ZWoJBK1VtnAXTWU&t zQY9$}9DHa(Jj~OJ+ z!YIVZ!N|iXz{J9+01{#3V_{+DV-#W%U@ihxitwBSYw&>E_X6OSAGjoCYGD8k!+@GP ziPnq^4B%1*QdWUmJ?WWcsd)-T`Q^o+rcRySw9k42pV-%7T^AwUmEjCbpAvGP8XNnaP^FTaM!3=6Irn;IJS`I1-7;mvdU4(8p zAF6{tg0caqR$&k-+74>?fGPu!m7q}}P-h05obQ2ax?0wXI#2+|mesPAFo3Ij#%z`% zEl}4rg=qmZs5%EV2})Q%a-fcA3bQ0bEqe{)0@fP#8uo=uwH!4ZHEb!&HVic!HB8xT zMMWiSH5|>1F-*0bwOlovHEby?HVidfHEb!YHViea3)o9IKxTnVE#wMks4%Kw1~;|1 zOW10-;rc-8IBU3TSelt?I7_%{xSAQ$n8A9w!Wk+Qz@00JT5gbeHH?J6Uz*V;QtE}Nx5?egT}GO!__LOvdD zE*mIkX@HX-Xn2(eG~CL}0WN?Mq!6fZW|U*(Vw7MkI>f-h;1-h14bsEFz@WvzzyKO# z0q6EfEDQ`a?8OqGo@WhcJe;+LqlPnuv6rouy@aubp@XZLsYs`WJ%veeG z%!~{jEXChS1X6fAIK>#68JobaT_D)OlENp+kix%^sg}P)sD>YuUpg5(ncErLnbVk3 z1X2WBIBEqd$~r)E1bMZBDeSdEDeSev6>%lZ3xq*FULe@PRU-&$=({k)y48w+RMd#1 z2xT)(U@S^05vdib5vWB{StGKLxt6+!Wz*OjvApF;S}LsRz`*ijD=p| zAW|cop+q!=y@owSNRpwMsgpg0wSzrgEJY-Pv4cHc9L$qwXK&|BV@eTC5o_V76{`{J zV2_tf5$|A+m+D|#Ae|zS0xD6&Ys4oo6-`KyEMd-)$!4FxRK$}aRUqmVlxn20 zxjaP~>Pm?H(l}hH0-DB#+AmWfQX_+6KXV~NI75k22V*m13STzM1m>co4)z7gDXI`% z3sfLo$%TxyvY?Qwkp-2YHC!NdC8{;D&5X5jHF7EJ*_>bz-UVtkav&8YN*&B_6Q_W5 zf=yKeo5~C`HANjX;Q>lXjG%5W3p{mdEM%&cho&`1devOWRI5;;UZaqr)y&i{P^(y@ zxIiOC8)O$!p3z*ORijWNzmSQMp@wIHc8xqp9>pA;g-o?dC?dKGnQE0wbZV4R^qQIa z6KYjTbZV4S^qZOby=qlUbQkE=s4QfxRV&f2QR`ssV5s5gU`sLRWvx{&(OqCrqq>l> zR-;0u#IQ!a88locP^(#^vB0QC6J+xQmcl6H;Z-!3D%U81T$;ij%%Evp#SfiF1$9+H zQ`DNQw^&MxQ;Tk~WaQ_j-eLg_Ki=ZVEY8mX7r<^b2C#dGpPO3 z!PLwI8anJ?tO3=^OhsB93=0@R{aDcA3DERum6>m10k)bC+@6FM-N;oRcm}Xo&rg#H zJcU`b2-F~9y~SQ!lnffzDOv@pr#N!+Q!>*sLDfrsP70{j08es(7@90a`#{ykUJ!8r zM1ZC`A?+A&1tI`x!Xm1T7*MqVD)t$eK<#+YBvzFcXqYe_JjfdlvKDFR4qbaPD2za1 z1!_rx+C1Q}ddCQwRtAmTfy%9ld!SZM4FhO^W&&gExfteJ)>^h&_8L~mU~UQnsAO2c zQo@+Un#Hz|v6chGTEJezSi`Z9sg|>bsVJ+4V*yw+iw!h24XSk(aDqlbi?RyED!OXe zTo_`TYPk^lYPi6qDO1sk8jci}Y!J;2)v=<3VF6bS7bxWw78DlLFclTla4p~jO*Iu2 zlyHMuKnr+ExI37$c$*m)G8PqdFc!Ti;Y(qw;TC5|VF%#_>>Z4ti78Nh(ZRTYtA-n5 zS~x?+yBc;EhS+DdJT)v67>k5zSZa8h89}VVKTy}P*6=K3s^x|97;89ccos6(@|7^u za5ghCGJwVTYxov|bOn?!E)W2*85v3h7YNnx*6@MyLJ8vn;TqnBjJ5nFA|;F|9L=CQ zrLBZ<0jS>K&l0QQ&k|2#f~u6L0of(F5Txb^LT3$smQ;ywmb4Q?iEx$-n3Q#5s1+z- zTp(A&S0ez@ox)iwSi?MlvFKV2a}8fJW36BZ6UYrUf}onS@J~2Hp;$Nrcx0B#58T!Q zx4NoW^}yqfpkd@HF2saRm7;HHPDy4#PO1Vz5VkZVgDS*skfX0BpedQu>kDDVkFQphfj|OhNfl_2qGRP3{bPAtiadB!9 zsHq8F>{8SU%1&&hc{!PR*`WDy(2A8?9Lf0wm7rvQi>0_Eu>?G!o>)>+RCEcXnxnWR zJ`v=+TOd|0n8lWu3|_jz5)tq3eT%)gBt923jm#b#?->yq9CQoJa1RQAF#JP2Zm}k3 zDlWOjT>u&^EC$Vg7lX?R zO_p1npx6R6Q;TnLfF|BR%%Y1R!_T-%Wq@>iM6i}f7YLYWBaxj4ge)$;X z7?~Kk7zMzSJ1mT#7AUCe4;v=tViI6vV&r2KVBz56W8`AzVF676iLeMTaxqCT@i4J4 zvN3WnRw?2xc%U{{DXJD@OFWg}(WSKf(!3N%5)?ol?$#@*C`kqlGJr}dP;UTUs%Jna z6BjZpU=@nFFegg@x=oM5ZYBCj-g3{|% zP|42(nUUiJ&)|VZcQl!bCW2%qfe1vmKs2)$X{IHZ=qz1?Mz{jFOUqVk>=p(9*ZW zbkMLjWS(CyzbIWlHBTSZRwypf2Thw6WhRxDfK+6Z}LbEBXQocSLjx#Dltla04nz9>8Ook&BUuk%<|UqgWXE z81Yr*=!R5XP*%{@(p7-0E3i^1ElJb00EuuxJfl#Q3S$*l7ISfdd-bXs5Fcw6D?nAL zYCsrZziSqAab>0{#Dh8U@d~!K3hMFkxrv#1@$u?b;EsNAWwBmjQF>XlL9BwULQ$$- zacPo9k-7#n%wzNlD$DI_VnF#u(_TegM?qa(M*&F_WJv)?Ahja1L_<{r9NNVinwng< zmtZ~2ZVU~`vq6A6=W7D*ecxOO3W#Nw!*5o3Ni~+ixq4YREr@s z8K``NCvi}r0b2h89yJ3k^kPyp z?KSOHKvR}Qso?o@_y}1xq-cdlY!PVjj3yIwgp7@$N(Fa5MVgx6Nlh%Sgth3Z_>p-E zwhC1u$O5`hFOuysab(jpbYoH=K2*_UDq>}1U_ka@5okyPn-|RxUPN&RXzl_Wz@YU4 z-~i^S1qZGe17t=>ld*~&>H)C1u#jZRE(7x+1gN144oW*J+f&2=@*z07zy#bPFN8%! zprZK}r>9?Vh@+2>Yfu$0oT*okSx}S!8Z-oXv>>y9>lPbiM5~GmLW5M?Vl1j+D%aLz zDFQd*!Oi*op!^SN&TBHdX)^iwX&M)S%60Ja3CL6!sEvfwAes--01Cxh9MB=I;#+*l zpmiYe2tK570q1jpCXq68QWJA>K$9W41(`Xi;FiEnP)mR{B{iuu{T4@hY6*C*x#$|m z3eXx7@T6~1A&3iF4paonCPiOCdN|4wi!u}QN{VlB6sJNOMMaFDAp8eXyaz-q2B~99 zttd&&OS#1YF73e6C*W03?9hdJkY*n*NH#tf+JY=v2GS0iMJU<@Vu6>>K2YrhD_K&DZox+}i@+`i1t@4j zC&Kx-v;uE42T6900n1PO>S^A6w~~856w%0iRV`3m2#PNTVHR+klmj$D#l*n`YL$wyfm)g@ z%q-yLY+Q^gjC@QY93pN!Oajb8j66(ye4s^cER0g%7A#1I03!#Z91|Z48!HDZ8yg=# z8yA~047`d20>Qoquj2Rgi;AJGJ*Z?i40M9Fc@>*pGWa(G&3w<0WYUus$oiDlVn)Hx{#rkxrD6*G)KS; zS*hI2)XZ4RT*Dm9z`{_%mCaR@!N>rDpe33S3?NdIqpB5LWh2eNftQ}^hCvq8f+ykf z6wsEwf#-4y@{5ZzlX6m_({TQ(qeN#NDcpcMn4N#F8Rg=Em`xIFa|1@KZA1$~%- z3YjI4*#LNefNEt>QyyGtfJ#JgrNIGedP6DJn=LoB zBoUO+i$GC%iv#Sz;*z2w(3-{~&{V@MX7I|M%)AnCTksaAYejM@csqh7%PlU*mJm>( z3|jY7Tyl#G;#RPc;-D-7u9v_B$ZxlJA@WeaWPp4L8mM7lXJV8BB~B(D@H$RD#v(gV zLIZ^-tcwIsXrQ&fH4Mc9B@8KyHH?r!@)`!v5KIXph|FdwvMXUoVXk3JVF3;Lm$1|@ zG&3!PH~I4vY8XmDlU;EotP4OZ>QGdHhZ#VfBlg5s@EP93%;MByg;danlw!~fC#YC0 z2Bi*ALm#xHG844+88iV3ijTw+P|8w3i3n&q3&<>ht+p&mO#`hJC;=_H1n=rmNJQ15 zP?C{Yq7GUElbe{8U!+i+T9lbu3{LQg8L5e&XHGIt<#9)+QP|)xN`9(*;7i0sZsSN5zT0z#3=cj>Omzo0#V@Tg9 z6*MPT1PXtJR9MPW0I!sREEKW=%M~l2?+3C18I%W^ltu~~RL5i%D}ZP0!J$#5p;`>; zsDT!@=P8sT_7{O1lL_trfs-$|b5-S}TC84-7GoN!#hM^9K&zaPYz0RMcrqOtT%dvp z)c6AB&MGbF2r?+RzZIO`v&N4Gpjaczc{(OiFZ|ZY)UN9xPf=2{Hz>{2RnoFYI*#pso1FMu{ALbrjyjROydL6=q~g7$%ArXWQn$OJt|do~}`oQeb` zW#+QfqFb!sxVps(jvR2Mb&EMMDf1Q!C`RDbD=4r*BdFkU9nkzo255ns8faZ^7HHX~ zR4r2nLl$U0hp(0yw40v_sO<-8 z`3W&|F;?-Rde09f;e!%A2p59}ygL|D7_&Kw1VHV+g$$jLWv!rPu^crFS>QGxC_@w( zlrYyYH8Tb?fEKrEvLq_ODp*iXLu$l<_5c)@D1f#ZR)A|k$db=A@Cqbw5v*PeE*n6; zS4hs!1?_nSjiN(pN04cW$r+icWvRuWRezua3|g%RUepHCQmg=KIw_>;rR#wzaZuYY z6}&pt0=%jZtPZr%sTi_`32a_o3bG?WkqK4-$`IhaEHH~eCWDtsm6MS3~wE8(6l>Ws)%}db8ZV^id!vfII4|LcE zoPt54ci@18H#n0)DIByH7c386n+k4oo(3feP}#=DP^ArtdZ=sS!3Mo?%JK&(A3WjcwfG0dE8? zhOE~F`(2X>;cZArgK{Ipubfc7rly<&`4Kci!2n(xQ^k+s!_*W_Mn4eZ2IX8(@fja~ ziz^;9ol}~V8Xtd)CqBNgG%*J%!yX@>lAjzOUj!QY0xhWrkD1(J4|5H2@(*?`@&y$V zpoQ;6ksuamsujs)aOV{{GBPmC0yzxS*5F`dVP#=vV&q`vkmBM6%T>u~L?`N28R%NZ z>&0qo>LPfG+PbmYn%JWQWEg0gdI2M7>J=RDj8$2P)#BwDsi2$)&g7s8wY+qNoc#Q3 zP-e{rFE&g~PX})zf;K&&tGkM=6hKRTp*ld@mp~g5^b}k{xjQXCU)M;_5L`cLG8ILE zVvVgh6}0wClL<0E#S;%R7gRcf0|88c%S$29kVHvhW?nH|)iqGSfYKQQTTv>gDFjMy zpr#P0W&-6-aN3&#N_z}h3`Ja^vaW_9i?K+phN)PoglPeD3TVcG1>DhK3}&cdf^0hk zrN?5c8ip*kVmqiF_M(6qhAj3hj^cn6mSBby)*8kIpfzy}SuCKL;B5AyGO&4UH4Iq@ z^BA(&L8|~j8x&)hKr`Dl%tbRwctAUbi)MiO%^FJER|lR|fmr}52op<7^1&|4%uBZgZ-WFay@%NaDQ&G3z!LdI3T}xx z#o*opSPM8+LFZs{Q}aq78!f@kjt9FBY#`V#Agf^dLBj!{ajlZfvecYPYfx7JTy%pP z_$9D#0@W`_Mng(&zbcL3>`d?;eFfEG9fg!quwxQ)Kx2ND3Q4J;=03PC({l^C#g+s< zwV}!xt|tjJ`2!h80tW<=8DO=Usl`x3QZkD{!I}bAmRX{w$$N_nG>}$Ol$e=U0$O_l zF{TLABe=x^ZWw_20=GC)Q!>F@I*UMSnZeuVvTt!`7RM(Rm1L$RCYRh21{LXvIiUJD z1+=;^H?gF+2$armae#MNfksw9c|emLJPdY=53*JqoN0>kb8hhL_#Ra z24zPU(6sR_W{^?fdjIXIgr@856Xm~F=hrqHqd5gM$ph0 z7kEgGg^7oeg^7=eg^7(3G}Oh!$N^@9_64!97L|aqEI9izFff1`Fre%U&a$8|Nnu>T z04kk88={LPKwF~C8ETpGEIWB?yo!B*t~ zj!!*8Hr4GIjipi%4mBGBnAkTMIlE2I)qq*NLDq^2h(S3-+t_+SYr z@l-1o)hZ+xrGgfjDdgpYTgSzE&_ys+QABD4PbGubFN5}2ff~7bT(I6?v4Tc&Mt(l{ zFbHsqR}-|V8M2R5lMB359g;FY`3M{v;4}grf&fpLAhxW4hblDLZn1*eEycGuK>h{| zB7zH%q6$#kq!L7Eg9vbW04BhxLK;*g<$%K>9vn)L!VSDwSr3#%z?~W%4n`Ix(4abK z7@P&Ppo0mLV2bKM$pn-{U>H;efJZMtb4SRd7bzm3-Fz*KQ7kE<&=CvP6fx+C1zQSN z3U>=b6nlzz3Qr1e3u6>VibM)u3V#b|Tm!Tmmm!KPMKVPwMYx4AiW`)iG^K9wfLnJ? zrI|S?sYO-FUNyy^}%3I4G1rG^jfQ4kaZ}D~vIVp8L8lG1xmD_0X$Il1qDJ0BnEZhje|@`M-?QOqL7xD znUk6V$-p4vKnD&%7JGntqJEl8u-<-ZUfC^CXp+v)O9jnxWu~OYr{3PDgw$iN2bKS6s>V4tQI=^@m?!;TaA;0#a;7Bs}3!qm&y z-%-m_!r!(8~H6Hqc5+MurkD(AM@E@XEj%4)9D5Pc~Ok6KI}?ks*>Hk0}Cl zMhP!;4J!jY)*$P0iYh^~8;rMDvNQ8iG#SC+Q6(N+l3xVb?guYFK?`#<`HCb!-Bd16 zbD|)%z|_$EmLMV!;;{%piW$f>HmI>tv=B5{11cxLle$HcpzsH^s){l}EGtlRh6|GH zf zidxW~RR%`T6dwl@8zX39kcW|vk%gk=FAsN%Q^A=MJivsd#|1fn2~^yGw(yx6nnN1^&=bm# z$|^`BqZqtu8`Q!8mt~+KuHsVgiqN#uoE%8=p+rvsW6rY}+?GTXRen|SV0XcLD&QW5 zYO#U_)E$~tk}j#mC7F4UMl5P}W4t8`0s$|^2`3yTu|i?&VUdvz*8=0+Y_h&2B+LZpo$ARm{-dJ znnlQB1f|(p))FRAN4|enEgR@unG_~y+GR-rom0e=&J5b)58m9wUc;Qin$1}hQp29Y zR>PdmWX@2_UMW_>R>NMyn8lvLUc;8c(aTcH5zdgO!@^L)k*pZ=m}6k16%;<6;$F&+PAooI_FhPx+#8DJi5A&N?o@k zG2IPxuvc<<$}MhCp9^+uAUh~2=cN`E&1Pg^AdnAOi)ujm08~?;wTU(Pil&03K)Is` z)YL^}iXw2E3N$xziwEqD_yX|m>>_ZQXG_b>%Ph_S+YZhgkQGv(=CCF=A|n*d0htb} zr*3hAI_BWAxM(^^a3LsLKqvUYy*M^VQv~AHNgyTQTmmM*S!Dtv1H&p%R?z{q%viaY zK+8#Zm_(R37dL1ur!$E&)G}9!l(5t=*Dz+Wf*SasoqV7pl~@=`*s{4mLxi9#P{OzXltmb` zz`8*rW)YBm1sr}=vO%SJptC9zz@e;HP^kcJ=|W4#TdZJS6|1gpVor{mCR5RTP|z%3 zWMBxXQh*kJU?rf`2QIfj17J|ynjDb$MYJlwF%61U@F)#9GQp9E+$ty5CSmedXP%FU5P^D19wLmn5vxYrOtVUoV zGb3nQ8+#2qs6;J47S52ul)_XiP$v)pZQ??k)BH6IS>iS9HT*SvDO|nGwSqN*6Bvs= z)Nq5s38WY7zF#%$SrQW%iu@V{3mb?j!#Y;*!Q@BBk+iTbt$S!1H zWT*jcoMgz7&r(>(Si>GKQKDF)R3ix5TVKN-F9`BemhuF~;v3-bQ~~ip=A|&D@YFD+ z@Pamb79OkNfw`ja7^}7!qLJ|!wrf#Xe{tdU@Gzf zs}KaM5CW^bT$uoyI4s!*N^ zu0Kj3ooVQ@3&;pHsP6^BpwkzjO(2L(I-t=PNFNx|i~$X&K$pgV1rQA)L{|`c247-M z4tQW0-0mob+6_LXA-N<6I%)&5RFkT(HAMlsET7c^y5)B;Mxph28loZy)gQ0pE%tPWn@e2Y0TuM)Bt8&QXWo8F+% z08gIY63WaifSil~&S0Q{kXz!QaXmrG7Dg4pyUbKmkL^k%1{Jqt!oN_+fBE4kS2eMi&lZ`2W9kI9AG1hQ%fM3AC&JQ z5xo*L0w9r*SO#9t4(S zECRu)NCjw1K@kr~85^jjZDvvgDmZTOq~<1O z=IDW!;ub;H<#HEf7U;#7rRJsN7eSWtN+XGYx2}TD>x68;Dh6+OxP_tuQfPxFmq0s8 ziy>2Z{K#e$XI2z}8q&9T!J^>R40(w;ko+o!BBlo$6D|U02T)G9C4s5}zEraqytxdr z+zB+6drKTuA#6`VF*tXEH<8?uL{$RXx|&n02ig)_1j>X^pTS(H2lkO3bk?Z|RLG#a z2BIQ2vpBg3+>QqALxJq%1*L#nDya5BRD+xLCHeU|#gHLF$e@-CHl?7V1Y8D!YVTW8 zSd~fBT`4uUGSfJsD zB4rQ@w9chS6?A}$64-J`LeWD+I!gJZ22v;sRtOKnqSQjYqSQjrm|#g_PEL_J$XL+X zEw_YG6@pjq6lsE_LC3S)Qb3i?FGwu{7wN@%kQP;Hkv7QBXr_RxjUrH|FbXZZnz*f-Q;;@12MYIFu>*78J1_l;J9wyLGJSOI0A;KXiU@OMKVa6fJp#T7qXb~;| literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/build_env.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..d744cc7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/build_env.py @@ -0,0 +1,215 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +import textwrap +from collections import OrderedDict +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip import __file__ as pip_location +from pip._internal.utils.misc import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Set, Iterable, Optional, List # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + +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'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._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_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._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): + 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, exc_val, exc_tb): + 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 cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + 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: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), '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:'})))) + if finder.index_urls: + args.extend(['-i', finder.index_urls[0]]) + for extra_index in finder.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.secure_origins: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cache.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..eb295c4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cache.py @@ -0,0 +1,224 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.download import path_to_url +from pip._internal.models.link import Link +from pip._internal.utils.compat import expanduser +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import InvalidWheelFilename, Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any # noqa: F401 + from pip._internal.index import FormatControl # noqa: F401 + +logger = logging.getLogger(__name__) + + +class Cache(object): + """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(Cache, self).__init__() + self.cache_dir = expanduser(cache_dir) if cache_dir else 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 = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # 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 = hashlib.sha224(key_url.encode()).hexdigest() + + # 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, package_name): + # type: (Link, Optional[str]) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not package_name or + not link + ) + if can_not_cache: + return [] + + canonical_name = canonicalize_name(package_name) + formats = self.format_control.get_allowed_formats( + canonical_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + root = self.get_path_for_link(link) + try: + return os.listdir(root) + except OSError as err: + if err.errno in {errno.ENOENT, errno.ENOTDIR}: + return [] + raise + + 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, package_name): + # type: (Link, Optional[str]) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + # type: (Link, str) -> Link + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__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) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + candidates = [] + + for wheel_name in self._get_candidates(link, package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + + if not candidates: + return link + + return self._link_for_candidate(link, min(candidates)[1]) + + +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="ephem-wheel-cache") + self._temp_dir.create() + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + +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(WheelCache, self).__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, package_name): + # type: (Link, Optional[str]) -> Link + retval = self._wheel_cache.get(link, package_name) + if retval is link: + retval = self._ephem_cache.get(link, package_name) + return retval + + def cleanup(self): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5827788461b4a45e5338d687b3b30e3555914663 GIT binary patch literal 281 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..790a677efe2e2f72e33ddb377f3803fe488f8b72 GIT binary patch literal 7822 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 b)x*;TI87jY&kbAO304Ic$K-Lb!c+nP164cH literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5efc33e663e701a89cd035dc321db03f741e708 GIT binary patch literal 2367 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 E0FqyA>i_@% literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..0a04199 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py @@ -0,0 +1,152 @@ +"""Logic that powers autocompletion installed by ``pip completion``. +""" + +import optparse +import os +import sys + +from pip._internal.cli.main_parser import create_main_parser +from pip._internal.commands import commands_dict, get_summaries +from pip._internal.utils.misc import get_installed_distributions + + +def autocomplete(): + """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 = '' + + subcommands = [cmd for cmd, summary in get_summaries()] + options = [] + # subcommand + try: + subcommand_name = [w for w in cwords if w in subcommands][0] + except IndexError: + subcommand_name = None + + parser = create_main_parser() + # subcommand options + if subcommand_name: + # 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 = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = commands_dict[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: + options = auto_complete_paths(current, completion_type) + options = ((opt, 0) for opt in options) + 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) + opts = (o for it in opts for o in it) + if current.startswith('-'): + for opt in 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, opts) + if completion_type: + subcommands = 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): + """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 + 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 + + +def auto_complete_paths(current, completion_type): + """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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..3ceea49 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,341 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.download import PipSession +from pip._internal.exceptions import ( + BadCommand, CommandError, InstallationError, PreviousBuildDirError, + UninstallationError, +) +from pip._internal.index import PackageFinder +from pip._internal.locations import running_under_virtualenv +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import ( + get_prog, normalize_path, redact_password_from_url, +) +from pip._internal.utils.outdated import pip_version_check +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Any # noqa: F401 + from optparse import Values # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + hidden = False # type: bool + ignore_require_venv = False # type: bool + + def __init__(self, isolated=False): + # type: (bool) -> None + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + 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) + + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # 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 + + def parse_args(self, args): + # type: (List[str]) -> Tuple + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + 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, + ) + + if sys.version_info[:2] == (3, 4): + deprecated( + "Python 3.4 support has been deprecated. pip 19.1 will be the " + "last one supporting it. Please upgrade your Python as Python " + "3.4 won't be maintained after March 2019 (cf PEP 429).", + replacement=None, + gone_in='19.2', + ) + elif sys.version_info[:2] == (2, 7): + message = ( + "A future version of pip will drop support for Python 2.7." + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 will reach the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "won't be maintained after that date. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + # 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) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if 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) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('ERROR: %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: + allow_version_check = ( + # Does this command have the index_group options? + hasattr(options, "no_index") and + # Is this command allowed to perform this check? + not (options.disable_pip_version_check or options.no_index) + ) + # Check if we're using the latest version of pip available + if allow_version_check: + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_version_check(session, options) + + # Shutdown the logging module + logging.shutdown() + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + name, # type: str + wheel_cache # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + Marshal cmd line args into a requirement set. + """ + # NOTE: As a side-effect, options.require_hashes and + # requirement_set.require_hashes may be updated + + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(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, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or options.requirements): + opts = {'name': name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + platform=None, # type: Optional[str] + python_versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None # type: Optional[str] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_password_from_url(url) for url in index_urls), + ) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..5cf5ee9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,809 @@ +""" +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. + +""" +from __future__ import absolute_import + +import textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any, Callable, Dict, List, Optional, Union # noqa: F401 + from optparse import OptionParser, Values # noqa: F401 + from pip._internal.cli.parser import ConfigOptionParser # noqa: F401 + + +def raise_option_error(parser, option, msg): + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, 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): + 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-options ' + '/ --global-options / --install-options.', 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.platform, + options.abi, + 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 + # gauranteed 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'" + ) + + +########### +# 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( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="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=SUPPRESS_HELP +) # 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] + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # 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( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + 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 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(): + 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. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host 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.'), + ) + + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + 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, or one or " + "more package names with commas between them. 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.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only use wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), +) # 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] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + 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. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +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( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def no_cache_dir_callback(option, opt, value, parser): + """ + 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=no_cache_dir_callback, + 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( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # 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 no_use_pep517_callback(option, opt, value, parser): + """ + 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=no_use_pep517_callback, + 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] + +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 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] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _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 = {} # type: ignore + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (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=_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] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + ] +} # 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..b17c749 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,104 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List # noqa: F401 + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "..", + )) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3], + ) + + # 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 + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + 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) # type: ignore + 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 = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + 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 - evaluated as mvarfmt % metavar + :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(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # 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 = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + 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. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """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): + """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, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # 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} + 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): + """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 + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + 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): + """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(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c7d1da3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """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 False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6da8a79b8f6a5e6ceb8290947baca9af60c53b5e GIT binary patch literal 2509 zcmZ?b<>g{vU|`Vf?~FOk!NBks#DQU61_lNP1_p*=B}N8@6ox2<6vh;$9L8LxC?-Y_ zn>mL$mnDh?%x1}9&1H*X1G8Ck*mF6eIKXVS9L`*>C@wIYJ%>A&CyEEm=E&jA<%{A2 zvpIA4a|NOVz-+D@!CavzAuyXeM>tm`N(9X2$q~&JixLB~d2_^bC88w2Y`z@HT&XB2 zFq=O|I#(u22Fw=7k$C zNR>+EN)<>IOBG6GOBG3#N##jpN##rDjZ#SwP7!HgNL6uRXl9I3O_5CzOA&8jj8aRH zNRez|h*D3HN|A11h|)-r31-lgt5W3(NKDR7Oixuv&d)1J%*@NoOIJwD$x$fCEKo?! z&&^HDODX1h2?}6M##{V}NyYg&r6sBHnYjh|MJ1Yyw*;N@a|?1(OEUBGoFU3J8E=U= z=jWwmrk55aqKfmoUmkaCP>M z4+{13^YnAqWV*!ya>^~1kjjEoO~za7P$QEWL1D$fz`(@7z`(-5z~Br@k0J~V44Diy z46!`5j5Ulkj9CnmnF?8g8CEiAGTvgzOUzBxWV*$qXK;%#xd@~dO#CX*FDS|^ODsv% zFH0=aPs`6qNi8bYH!{{YHZwCTwo}5Va33}P{U9pP{L5cSi;oIRLhvhQNp-@c_BkB zV}(o&qYFcOoYZ1HKTXzKeDNSX@lXxLw|HT!c#tP<@xi(I zMJcI8w^%bvQge%MvBQjFxy25aNKLuLk(`?XmMs!xU|@h76rY@vSX>N_4+tRvmQ7DB ziH8`HnOdw13IuSe#LU9T!^FYF$5^BU3LIEk0EHAN#K396jDZ1E7BS^8v*UJX+Uqa;HxLke>+LkdeUgC=X06f~KEgGM2- zv?O0QIlrhVHMvBu2xJ>5M}pjzoReRi8lRh3lAMuR>;?)c_LR)Dw4BVOB4v;VSab5r zQ;UkEL2Q=n)XHK_X0X2@vV0Kju)u?O9Got}z83-6P@I{YnUh!q4|+>bAn24X#93-uy4kQ!+mYBCawGm6;psz}W#C;|ojEnH^gWEPhcae~Z{!C^}> zsDda0WzJi;99s;oGm5xD#^AE3I3vHj2$Z^S$>FdFTHF?a+90<;)hD(HDTP%wMSLLJ za5=ghRR0w5gOo_2T31?1 z%0)#oAmyO!4=$;|`4pViAn6~JFd-~Zvb@D%lbfGXnv-e=N=3zPpqh=5hlz&~2V~-5 WVqp|ug{vU|`Vf?~Iwo%E0g##DQTJ1_lNP1_p*=Ck6(F6owSW9EKnfZCevB}I(C-O2dFo1&D85Ee?7#J8z7@8Skm};48 zSxOjdn41}6m}*&T*(z*mSX~%mO={U|m}}T28M2saIVx0YSV3$ThFFPO&JyMYEGdjN z>@^%UoGDC_3=3Hp8469p846{>87iD=*jyN5tx$Ap)v!Tz%f&F)a@BIz@_@}?2AjcC z!&Sq*kd2X{uqd3NFe;p(hP8M}4O{V&8kV9JDJ;PZV706Z89`AEia@_AE!AQL)nbLB z)WXutqErxDN1;3;GdV*cvsfW7zXTD6dPR&33=CDe5DgiLa80?Xc_j*}#X1T}r6mfL z`K6FB1}oEh3DzU)m#>gil%JiN2eSyIr&u8^zcepJPm{F>lroDzp?izHEVZaOGe7SZ zTTXs@dTP-vmdw1gd`;e4EXAogX}8#+adC?!u_(Rx7B@6rLCGwNw;-{oI5RIjzMv>S zsrVLqZe}rvdy6|cKQApOGr1%)FZ~uzK~a8IYH~?@USe))5eEYU!!0g&8mPR*k&;>f zmb%3aV!<54T$Eb4lA%b9fq~&yp?*P8W?5oMs(x8wk$zf!PD*M~vA&V9zOk8^S-C}t zrFn5)e2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fi5&j>RK4&W@ls@<$wgiI6gD4B(*3n zF-Jccl9!70!HH3?pz;=TQE8qKD6J`h5+EZNBM%c7BNrndBMT!FqZl)YEdpipFtRXJ z2_WYNy`s`QKTVEX9Pwa}#mC>`ijU9DPbtkwjgP;@6CYn#nwSF$jrjOm?D6p_`N{F| zw^%>|w^&Py6Vp>~u@{%-<|YVX3UoKCg{vU|`Vf?~EzrW?*;>;=nKq0|SEt0|P^G1Oo#@3PTEG4nr^AcpACgUys#H8ZfaPIS-4Df}Bb$VGA<2I9e+f zXP|;YBpw=^8X6FDbqy6XHF1R~*06+FV;GAkNRvx)6m-1_1Yvs6&1 zB87>9LUC$|f^JR)QmRtWNQUHsoXk8>L~1H1DdE-v_P&A!79Zy(mSlj;$}36C%qv#V z%~a6U1@XZ-3}SYPrUE1#f|6vgrmi8HF^D7vid&ddF+x$n5Y>GpMVWc&3dIFEnI#G_ z3Setf%Mx>t?TR*xMHmjsnji~67?Fb05*3s*;xU6yQ%ONL88r!OGT&lJN-WN}#avaK zaf<~M;>n<528NlTjA9c828L9ID8>|qD5ey~DCQKVD3%oFDAp8~D7JQnG{zLx6t)(Q zD0WaG*1{0Q(ayla5XBkHpviel&>3FpKuf7AV@HLI)SQCUB2bA0Dz_9$@)eR&6-tX! zQxwwj5yDVUW#;GU-Qq%Us&p|7z^64NnGxy_P*Kgnz`(!{Dz0-F7#KQLOJVP2V`Kn}a-?vkFsE>(u%>V$iSnfI zrZA`QrLd;(Lq!>~SQoIR2-GkyWC9iU!3>&$epPI`x}fl`V$w~z#a&#IUz8f3oS#=* zQpC!@z;KHdTu@iZy5?qNJacMzn zQ4uI4Z*j!OXXa&=#K+&_NX|`(&o3w`zQvW80%m3A=iOo}NGvK&ExIL~nOB@zR02|v znV%P*UX)*2pviKJr8qSw?G{U7QF`$$rtI<}Ay6&Lc#AVWJ~=0`xHvw3CBv^W{eq&* zvc!^9{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV%M?pf6JyhI0|Ntt^aA}5 z{esK_-ORk=lEj=GT?>QU?2K%q9FQOw$7kl1q!#5R=IBGqjbac38s>Thl|_OK3=C$V zl%fSnK8!+4Y)mYSER0NG$iaw%%~U0Yk>d4Wfs_o(QJ}~HVP}x}Mc|aUfN>#1Ei)+9 zwJ?-0)i5_Rx-c{|*0R(vW--?=XR{SWl&~ydEn!%|1`v4ks(j4ge!}C0S~Bov4FRRWg%ECBSQ)YC~sEj1{7uHl@u$K zWTaxGxBN7)aC&B0YMuf(VZyT!69WSSC@Ten952Gaz>v;R!w}0;%b3DY!zj)$k*Sa+ zm_d`Vib+?uND368Ot+Zy42rlJ7#P5O2qDeD!0?O9CMUDF1eCSyz@~wWW@D(*#0@TwW6fF zD6!xcTS{t5YF^1L=JeE(B2WO_Vl4m#;4OY9$6!}jL&MYG?-p}0*p!l#)S{wWtmQ?S zC8@Vqvhp+YG}(&8Kv|tVzW~%)C@vBQ@z}uOTYQTbOhfZXaghRMfZbv)D$NT3g*zyx zFfeg23NdmqvM};6@-d4su`yPOVhuS>E>K3zOUzA;kH5tgAD^3_Qknx|^Tfv&mL}#v zW!U56Q}UDJ<8QHm1a7exm*(as7FFI7&P>k(l~qNlg{7HAsqtm0d1c`2QDgveJ})%4 zCa31)#K%Ko7aZ@5MUo&dfMOb4T7Xm+^Dr^Ie#KFkH#KXwL!otnO&BV>Y0syPLGco`G literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8eadfb568d8578fdbe6612a80d3fede86e8a023 GIT binary patch literal 6435 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbd93e26b6ba608b791907dfcc318ce3fae199af GIT binary patch literal 2879 zcmZ?b<>g{vU|`Vf?~K{a!@%$u#DQTJ1_lNP1_p-W0tN<#6owSW9EM!RC`LvQn<0aP)4x@0|P@ULlk2QLljdAV-#}=Qxr=Ia};X|OB7oQYZQAsLmFcWTMBy%M-&Ih zk1Y&Qob3!O3{hOc44PcGc-_FxfjYRVf=fX`LBYSYq@c7!Av3SIBrzu^HASHyF*!Ri zJ+)XNGf$x?wXig^C^a`VucTNZ4eUETF0eMZs>GsHg`CXdlGGHChD3$r#Nt%l%)H{% zyyDD~%(7I4;`}0zWPVXfYLOmTZxI^<14ESYUQj3Z(MUokz!3YXYP6h@Beo*q-#lXN&!cf9k!_dr>#Z<#s z!_>#f$WX(O#hk^G!kEI8!kogA&XB?i3f5kBxC|r#fn>N-cv9GrWO!5fQutE@QUp_k zQiOZi;5tN7M8TqBDZ;(1a8dCTi4=hp$rPyttR-v<8O0bMDFP{Sa544; z94Yc3w=HA>CFo!VO$EOyCf%YcUR_C>I8~t} zBUJ$$A)q(|andu(QqiM3GbdFcF)u|Sv!qxdIX@SY2+A{3^Ayrk^HPfvOEUA)74pH! zM^7OnBePfm5{C-OiFpc1sS2gVsVNG%r8y;;1v#k-C7HRY#d?~ow^&kAi%V{?B_@O7 z`xbjjYFc7xPRT9y+|-i9vc#fWEE%ae1yxMCX;nPBx@nntDY`kCdD+FcxIpZ92%9-H z$fwFCG{^^(C>1~wAh*EMq>e&)MrLw`LV0FR4#**iDJiKb3MKgvZ$lhh#iW~4#jdNH zlb@WJbBh&1aTS;37p2CR6qTmBRfT${fkG!yp)9kgq%<)nHLpyeBqOmzAtSL^Aw4HQ zDKSSOF*!N4xL8LaC0`*gzXTc>P|2K1P&PozRC<~$MFI>A3`K$&IM z?92j?uZvSrvNb5iArWV#pjuqTq@$q8jN~k^i-dG_Q!A2lN>fsGQ&Tca5|eULZwWv} z;$b3Hs;&?<3NR6vJql?>`MFRp=oNvoo+jrl*5cBF)S@CD1_p*(9P#m)d6^~g@wYgV zb5r8;3rdP_aV4gJS(*8Hw^*|BGxKh7xVVPJ2Y9;&-(o9BECPj)FsN)PDgkN8%+HHY zFUl`1&}6>FQkfEmJH_O^i*;4Gatn(hKxM^b0ZzVDYGH zVUU}hk!_R%5(MM;%)FA+qP)Z$eNYBT%u6ZOhs1(jL1mFF0|SE;sEqLg6+DbWOl*uS zj7(6-!HmK~lH*`vgQ{U-kHBrYbR%qFfIamdT*94P+Y!0|Ns$0|SFI$o@&t zGOn4Sgt3{SnW>h!gsFxxi@AomnW>hggt3IBnX#6&hB1q^*r_sK1LUYSdm)x z62UB?1;RD#DNN!FAd?C+!WqIDQW$Dj7KkilU}T73NMQ(O&}8=0g^VDab@u>w&IeM{L+$JtmQ?SC8@XA zlXFrN^GXXeIf_(3rm{l{%;F+d5RVU1!Nw;;+7CtgAlnT?BMTA)r9UoaCPo2938pGR)KpYdny1MP z%9weHxvBB-x47a#o+`}&v3cU-3riDopfc?7@hSPq@$t79d@p5P~IhlG% ziN&e$&^%iNYHQw7MpXog&75LAv?u|mD0x(s`32y*Fh8$Y4-!p~_?JReRa%mnQ>>Sq xpIeYv0!e0~MXcpelohiGzuU5ek`jm;oLqLJR-^ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62b4c601534e998670d6209f46815d3c95ce41bc GIT binary patch literal 2073 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2f8ea25d01dd521bb64b97bc277f8de4756c525 GIT binary patch literal 12466 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38100a1188706376acf1b68645ddcf481f7ffc66 GIT binary patch literal 8715 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccf9b2b88dafd46c66d755a7a89704a12316258a GIT binary patch literal 4315 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 MOgv0Hj8Mo70CCS2AOHXW literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67bcdec8eb48c215cc6bc85dc247e4cdf399881c GIT binary patch literal 5008 zcmZ?b<>g{vU|`Vf?~M5`&A{*&#DQTJ1_lNP1_p-WZ43+yDGVu$ISjdsQH+crHd78$ z6jKUA3R4bq6mtqg3UdxiE^8DkSdJx!Etfrt9n5CU;mGBT;smqVa=3E2qquWF0n*{ECLH_GTstK(i~8fT98Qpix4i;_XUgJEVU zqu7LjfgzP4iZO*DiYbLLiaCWTiY0|PiZz8Limja?jWLBag{_4niamurg`&u^U@(U7w4yylqVLYDx{Pafdo^_ zQj01TGV_W{5_59&6x{NQ6ms)H(y1khnK{Ke3dO0ZAmhQNm4jkmAtgV#*h(Rzq@3O2avD_EO?f@(oge!4<5GW&w%nMjb z*cWgtWLOAN3*m91@VH>SEEZ6vOW{o6O5sl7>1BoM=7y;No5h2|<3-`|q44-ocmgOq zK@^@43Qrh?CxXHgh4HdjKt*Z_R|;nee~JLawOK4Ff+<2N!YLvtqP;9|_lv>wfZZ<+ z;gzs2kSJl#lB{9Kl3K`A%L1YoNT-O^uq6TY<>*|6d zPd6pA=oTlK84qGIr(_mY`JlvZW?o6Yf=xQV$m&jsNP#F8L2r1ReZX-pzub{K;#u>e%&Rav@LloTZ@Bo?KYf~t;U1yE*9RVXekD9Fi7O#yM$ z!6k-XL8SsxA)v0O$x%)r2Ki!Cu3R1+16GB7Yy@$2fQ=j10P=D-}m2jRk8 zQ56NT6e6ksbrQ&`BvhM01uNY0K3Kuq$U=pf{XQ()Uwo^`~pyTD3qlZ zfr__cJq4#qSTyMb0iTJ~<~fG4B>1RC9brVsS=l z@h!pJ#Ozd%-!t>`;?s-rOABssXXd4(RzNvy1&Kw)sYSPhGxLg5i%L*bYO>y9DNfBv zyTy`NlwN#`DZ9K#4ivCl5CifHN^h5LuG7EH}^|Y>q zL2hKIV@%_zjg#>B$N!pOwP z#K^+P!OX`9f)GAPjDrcp$G}WTDwttx4i-K}KCo#ZbE-taZ5C)-NDr2}l3~p(P<F^eu@sqv_r@0A-#P3%n;t9&FpxOhR z9a4*}6jY0UG3pe7(t#$^Ew+@@oYa!kTP)d`c`2HVMFya56?>5`Ci#=`}Q!38Cldy6e6KRrFQ=oV{AYEo(XEtahO z%sg=96e)nb!UAeN-eONoDh4r%>_K9DP>W#UC<^66o8j@0a4rIQtO!&n+~NcWF*s`Z z((;RP6HDTg^YcoI@^gwnz3d_$kl#5$1SoObk|@Y8Cb?hKvUT~#SS`ZIv-51|thjKOfi%dak#6g4^NFlUJC@sn< zhQz2VNR$U`Lp&rS6uE;`g9^u6obdM6Eq*kw7P){la=@H?i>W**iVtE;T4H8SX;Er% zkrl`wFkuZ+%v@BOmjfzu%fJ-?7ZV>N8>0{-3lkfo0FwX{A0rQ_3Si=46kudxVq)ZC z22~GSj9kp13IbHrgZQAT0#rR9V~{vV4HpwgEgK^j2r{uSg3M%M>N^?@<<8SfA#}}3+=0IiGLC@7;LLVQ6kQEuNClLEZpom^m6l}Y6zi3w<`#hR zE;yUsLJJ&lc~k_-QMWkLQ%iing-KC1C@z9P1gHgyh$aXN6iK%@Y;yBcN^?@}KoL+Z Z!@$4*PC`sPj36igCP6G7Mjj?EW&p{P%7_2} literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..801cecc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,41 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.operations.check import ( + check_package_set, create_package_set_from_installed, +) + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + 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]: + logger.info( + "%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]: + logger.info( + "%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 1 + else: + logger.info("No broken requirements found.") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + '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] ) ) + } + compctl -K _pip_completion %(prog)s + """, + '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)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + name = 'completion' + summary = 'A helper command used for command completion.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + 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, cmd_opts) + + def run(self, options, args): + """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, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..826c08d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,227 @@ +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import Configuration, kinds +from pip._internal.exceptions import PipError +from pip._internal.locations import venv_config_file +from pip._internal.utils.misc import get_prog + +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 + + If none of --user, --global and --venv 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. + """ + + name = 'config' + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + summary = "Manage local and global configuration." + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = 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( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help='Use the virtualenv configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".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): + file_options = { + kinds.USER: options.user_file, + kinds.GLOBAL: options.global_file, + kinds.VENV: options.venv_file + } + + if sum(file_options.values()) == 0: + if not need_value: + return None + # Default to user, unless there's a virtualenv file. + elif os.path.exists(venv_config_file): + return kinds.VENV + else: + return kinds.USER + elif sum(file_options.values()) == 1: + # There's probably a better expression for this. + return [key for key in file_options if file_options[key]][0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --venv, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + logger.info("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + logger.info("%s", value) + + def set_name_value(self, options, args): + 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): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + 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): + """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): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..a57e4bc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,176 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, normalize_path +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. + """ + name = 'download' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + 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, cmd_opts) + + def run(self, options, args): + 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 = [] + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + cmdoptions.check_dist_restriction(options) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=options.download_dir, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=None, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=False, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + 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( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks + +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. + + """ + name = 'hash' + usage = '%prog [options] ...' + summary = 'Compute hashes of package archives.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + 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 %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +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""" + name = 'help' + usage = """ + %prog """ + summary = 'Show help for commands.' + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import commands_dict, 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 = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..1c244d2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,566 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR +from pip._internal.exceptions import ( + CommandError, InstallationError, PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme, virtualenv_no_global +from pip._internal.operations.check import check_install_conflicts +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ( + ensure_dir, get_installed_version, + protect_pip_from_modification_on_windows, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +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. + """ + name = 'install' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + 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.' + ) + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + 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.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + 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") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + 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.' + ) + + 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).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + 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", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + 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, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + cmdoptions.check_dist_restriction(options, check_target=True) + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.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." + ) + install_options.append('--user') + install_options.append('--prefix=') + + target_temp_dir = TempDirectory(kind="target") + 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.create() + install_options.append('--home=' + target_temp_dir.path) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + upgrade_strategy=upgrade_strategy, + force_reinstall=options.force_reinstall, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=options.ignore_installed, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # Consider legacy and PEP517-using requirements separately + legacy_requirements = [] + pep517_requirements = [] + for req in requirement_set.requirements.values(): + if req.use_pep517: + pep517_requirements.append(req) + else: + legacy_requirements.append(req) + + # We don't build wheels for legacy requirements if we + # don't have wheel installed or we don't have a cache dir + try: + import wheel # noqa: F401 + build_legacy = bool(options.cache_dir) + except ImportError: + build_legacy = False + + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + # Always build PEP 517 requirements + build_failures = wb.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + wb.build( + legacy_requirements, + session=session, autobuilding=True + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + if build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in build_failures))) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_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, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + 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, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + return requirement_set + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_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 _warn_about_conflicts(self, to_install): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + 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 EnvironmentError") + 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 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..a640274 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,301 @@ +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + 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.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + 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", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + 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, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + session=session, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + ) + + # 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) + + def get_outdated(self, packages, options): + 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): + 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): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + + for dist in packages: + typ = 'unknown' + 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] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + remote_version = best_candidate.version + if best_candidate.location.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 + yield dist + + def output_package_listing(self, packages, options): + 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: + logger.info("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # 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: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + 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): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import get_terminal_size +from pip._internal.utils.logging import indent_log + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains .""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + 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): + 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 = 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): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + 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() + 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): + 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 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + 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 = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..f92c9bc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser # type: ignore + +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 + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + name = 'show' + usage = """ + %prog [options] ...""" + summary = 'Show information about installed packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + 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): + 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): + """ + 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] + + 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()], + } + file_list = None + metadata = None + 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 = [l.split(',')[0] for l 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): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + + name = dist.get('name', '') + required_by = [ + pkg.project_name for pkg in pkg_resources.working_set + if name in [required.name for required in pkg.requires()] + ] + + logger.info("Name: %s", name) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + logger.info("Required-by: %s", ', '.join(required_by)) + + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +class UninstallCommand(Command): + """ + 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``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + 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): + with self._build_session(options) as session: + 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 req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=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() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..cd72a3d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +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. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + 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."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + 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, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=options.wheel_dir, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + # build wheels + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + no_clean=options.no_clean, + ) + build_failures = wb.build( + requirement_set.requirements.values(), session=session, + ) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/configuration.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..fe6df9b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/configuration.py @@ -0,0 +1,387 @@ +"""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 locale +import logging +import os + +from pip._vendor import six +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + legacy_config_file, new_config_file, running_under_virtualenv, + site_config_files, venv_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +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] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + VENV="venv", # Virtual Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +class Configuration(object): + """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, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] + if 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[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._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("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_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() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = six.next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the currentin-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) # type: ignore + + # + # 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 self._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(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), 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, [] + + # at the base we have any global configuration + yield kinds.GLOBAL, list(site_config_files) + + # 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, [legacy_config_file, new_config_file] + + # finally virtualenv configuration first trumping others + if running_under_virtualenv(): + yield kinds.VENV, [venv_config_file] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + 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) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/download.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/download.py new file mode 100644 index 0000000..2bbe176 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/download.py @@ -0,0 +1,971 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, + display_path, format_size, get_installed_version, rmtree, + split_auth_from_netloc, splitext, unpack_file, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.hashes import Hashes # noqa: F401 + from pip._internal.vcs import AuthInfo # noqa: F401 + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + 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 + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.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: + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + # type: (bool) -> None + self.prompting = prompting + self.passwords = {} # type: Dict[str, AuthInfo] + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Split the credentials from the netloc. + netloc, url_user_password = split_auth_from_netloc(parsed.netloc) + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Use the credentials embedded in the url if we have none stored + if username is None: + username, password = url_user_password + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # 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) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[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) + + # 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): + # warn user that they provided incorrect credentials + if resp.status_code == 401: + logger.warning('401 Error, Credentials not correct for %s', + resp.request.url) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + 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): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # 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, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely 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, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + + :param url: File path or url. + :param comes_from: Origin description of requirements. + :param session: Instance of pip.download.PipSession. + """ + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + # type: (Union[str, Text]) -> bool + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + # if we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + # type: (Union[str, Text]) -> 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 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 + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + # type: (Link) -> bool + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + # type: (Link) -> bool + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + # type: (Link) -> bool + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url( + resp, # type: Response + link, # type: Link + content_file, # type: IO + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> None + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.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 = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + progress_indicator = DownloadProgressProvider(progress_bar, + max=total_length) + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + else: + logger.info("Downloading %s", url) + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + with TempDirectory(kind="unpack") as temp_dir: + # 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 = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir.path, + hashes, + progress_bar) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + + +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> None + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # 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(link_path) + + # 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_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, 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): + 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) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url( + link, # type: Optional[Link] + location, # type: Optional[str] + download_dir=None, # type: Optional[str] + only_download=False, # type: bool + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :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 is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes, + progress_bar=progress_bar + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url( + link, # type: Link + session, # type: PipSession + temp_dir, # type: str + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # 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 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 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"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + 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: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(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 + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes, progress_bar) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, 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 os.path.exists(download_path): + # 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 + return None diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..38ceeea --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,274 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +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 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 InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + 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) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + 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 = '' + + def body(self): + """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 + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """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): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # 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 ' %s --hash=%s:%s' % (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): + """ + :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): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # 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 = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + 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): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/index.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/index.py new file mode 100644 index 0000000..9eda3a3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/index.py @@ -0,0 +1,990 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import cgi +import itertools +import logging +import mimetypes +import os +import posixpath +import re +import sys +from collections import namedtuple + +from pip._vendor import html5lib, requests, six +from pip._vendor.distlib.compat import unescape +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.requests.exceptions import RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.pep425tags import get_supported +from pip._internal.utils.compat import ipaddress +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, + redact_password_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from logging import Logger # noqa: F401 + from typing import ( # noqa: F401 + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion # noqa: F401 + from pip._vendor.requests import Response # noqa: F401 + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either emply tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + +__all__ = ['FormatControl', 'PackageFinder'] + + +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] + + +logger = logging.getLogger(__name__) + + +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. + """ + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__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) + resp.raise_for_status() + + _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_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', 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", + }, + ) + resp.raise_for_status() + + # 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 _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 _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.debug('Cannot look at %s URL %s', 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 as exc: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except requests.HTTPError 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, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return HTMLPage(resp.content, resp.url, resp.headers) + return None + + +class PackageFinder(object): + """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, + find_links, # type: List[str] + index_urls, # type: List[str] + allow_all_prereleases=False, # type: bool + trusted_hosts=None, # type: Optional[Iterable[str]] + session=None, # type: Optional[PipSession] + format_control=None, # type: Optional[FormatControl] + platform=None, # type: Optional[str] + versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + prefer_binary=False # type: bool + ): + # type: (...) -> None + """Create a PackageFinder. + + :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 platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # 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 ~... + self.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 + self.find_links.append(link) + + self.index_urls = index_urls + + # These are boring links that have already been logged somehow: + self.logged_links = set() # type: Set[Link] + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] # type: List[SecureOrigin] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # Do we prefer old, but valid, binary dist over new source dist + self.prefer_binary = prefer_binary + + # 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(self.index_urls, self.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 + + def get_formatted_locations(self): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + redact_password_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + def _candidate_sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then 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.valid_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 + """ + support_num = len(self.valid_tags) + build_tag = tuple() # type: BuildTag + binary_preference = 0 + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self.valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self.prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(self.valid_tags)) + 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) + return (binary_preference, candidate.version, build_tag, pri) + + def _validate_secure_origin(self, logger, location): + # type: (Logger, Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (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.) + protocol = origin[0].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 (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + # setting secure_origin[1] to proper Union[bytes, str] + # creates problems in other places + else secure_origin[1].decode("utf8") # type: ignore + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + 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 patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] 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'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + 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): + 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] + + def find_all_candidates(self, project_name): + # type: (str) -> List[Optional[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 _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True, + ) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.iter_links(), search) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.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 all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = 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, + ', '.join( + sorted( + {str(c.version) for c in all_candidates}, + key=parse_version, + ) + ) + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % 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, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + # type: (Iterable[Link], str) -> Iterable[HTMLPage] + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() # type: Set[Link] + for location in locations: + if location in seen: + continue + seen.add(location) + + page = _get_html_page(location, session=self.session) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + 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 _package_versions( + self, + links, # type: Iterable[Link] + search # type: Search + ): + # type: (...) -> List[Optional[InstallationCandidate]] + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + # type: (Link, str) -> None + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + # type: (Link, Search) -> Optional[InstallationCandidate] + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return None + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return None + if "binary" not in search.formats and ext == WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return None + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return None + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return None + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return None + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return None + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return None + + if not version: + version = _egg_info_matches(egg_info, search.canonical) + if not version: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return None + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return None + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python " + "version in use. Acceptable python versions are: %s", + link, link.requires_python) + return None + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + +def _find_name_version_sep(egg_info, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + `egg_info` must be an egg info string for the given package, and + `canonical_name` must be 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:: + + >>> egg_info = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(egg_info, 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(egg_info): + if c != "-": + continue + if canonicalize_name(egg_info[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(egg_info, canonical_name)) + + +def _egg_info_matches(egg_info, canonical_name): + # type: (str, str) -> Optional[str] + """Pull the version part out of a string. + + :param egg_info: 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(egg_info, canonical_name) + 1 + except ValueError: + return None + version = egg_info[version_start:] + if not version: + return None + return version + + +def _determine_base_url(document, page_url): + """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 _get_encoding_from_headers(headers): + """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 + + +_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + +def _clean_link(url): + # type: (str) -> str + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # type: (bytes, str, MutableMapping[str, str]) -> None + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return redact_password_from_url(self.url) + + def iter_links(self): + # type: () -> Iterable[Link] + """Yields all links in the page""" + document = html5lib.parse( + self.content, + transport_encoding=_get_encoding_from_headers(self.headers), + namespaceHTMLElements=False, + ) + base_url = _determine_base_url(document, self.url) + for anchor in document.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self.url, requires_python=pyrequire) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/locations.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..c6e2a3e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/locations.py @@ -0,0 +1,211 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore + +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Union, Dict, List, Optional # noqa: F401 + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + # type: (str) -> None + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + # type: () -> bool + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + # type: () -> bool + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + else: + return False + + +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/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + # 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/': + bin_py = '/usr/local/bin' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +venv_config_file = os.path.join(sys.prefix, config_basename) +new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + # type:(str, bool, str, str, bool, str) -> dict + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + d.parse_config_files() + # NOTE: Ignoring type since mypy can't find attributes on 'Command' + i = d.get_command_obj('install', create=True) # type: Any + assert i is not None + # 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), "user={} prefix={}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + 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 + + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + if 'install_lib' in d.get_option_dict('install'): # type: ignore + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + 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 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d9efee0b220a68a2a3fc14dd462d93be8bf3f4b GIT binary patch literal 269 zcmZ?b<>g{vU|`Vf?~Ji$U|@I*;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCR3G#qe4Mq za&}^RszOOdVu?a>eqKppW?r#EZhlH?PBBEVD7By{wKz4eL?Jb=B(o$lwOEhKPm}Q$ zdwhIKesX;LN`@jP1_lW6t4P0~D6=fFBvrpGu}D8HKPM%%s94{~Sl`&p%&gp^#L~Pt zFFwV>DAzK@($vJ*wA{eJz#zRqKSaMEvp_d9uec;JCr8)9AU8WB+b9Pl2*&Z5c_pbu md5Jmt5SQu4$7kkcmc+;F6;$5hu*uC&Da}c>139A@g{vU|`Vf?~HL{VPJR+;=nKq0|SEt0|P^G3IhW}3PTEG4nr}-z zcZL-96pj{#6pmDuX67i~6wY72A$kPR@*3}qB+FfcHrGDI<^Fhnt>Fh()AGo&%5Fr_fJa73}Bu%xiI zFhsGoGq5m3u>~_|vfUE(%quQQ%*jbC$;{7lPRvWmOi3(Bt+EVCEhtJYPR%PRR!CGR z$S+CFE6GgEQBX>TDN#~L%P&&MMAEItrJ$gokPHfIkYhkJ2!mW!Y{kI9P{UZm5YJG; zSi{r|VlmY)*D%C0m#~zu)-W_PWwF&TWHHn*WHHq+WHF~Pm$0TV_JU(5m_d`t59Iai z)XH0YDXD3hd6{|X@yR)f#l@QJx7Z7c^0QKtOK$OkLpr_;5@xs9VGNF({A95AZm|}Z z7NiyxaWXJ4+~SCj&&B9OOkao9k@ a$qp3n#h}E@!^FeL!^FbK!^p!ZzzhI=AXr8K literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a7693e3433492ab06f50bc02bd9b1ef1cad426d GIT binary patch literal 2272 zcmZ?b<>g{vU|`Vf?~J*@!NBks#DQTJ1_lNP1_p*=7X}7~6owSW9EM!RC`LvQn<4o)q(#pza*UzM5{oLZ6$G7E;8VQ%$fU|>jPh+<4(h+;}%jABj^Okqx8 zX<>|FNnuT4Yhj3DO<_;rXkmzAOW{o6YGH_CPvuDAPT^@`Xl9J!OyN!8Yhj4uO5slt zXkm!rPGJgW&=k7G>y}@Xn^@wUpI1_ppHt=Tk(yJGTBMMcU!;(mn3tHInU@aY&DGiWmU zX)@npE(V28UVeO1W?o`Z`bXEoAU8WB+b9Pl2*&Z5c_pbud5Jmtx%nxnImP;E-~fzIhJ>JALFFxu z`1s7c%#!$cUXY(bj$vTpU}R(DU}R%rW2_QG335G{;$%=LfkF&KgD^P6K)P!fvKVR@ zvly~LQO4+}$q2F`B{R7sK3{f8laKy(Kr4|&$$IF5o$^mi< zBMT!NBMX-JfhdHhXpmz;7#v8GKq;DG0YeJoLdII=3bz!d8s==aqJSEv1&j+B7#V69 z;WSeU(?Ui@h8pG+h8pGt%phJ0vp7R5lPyCEOAT{2dl3&P%@^{7GgMgBFuO3s8r8DY zu%xhLGZp2*%qfg0VX0whW~^nYVOqdi!vZ#uaRC#ARTvS@05U_9)$bRhP8F+FVor|L zOHc?`v03Hi=cQU{vfW}WF38C&xy72ClbTp`i#ahR2l)6A_y}+X2=*bfSi-Od~ zfknY;OPFhzni+!`G+F#^u|bO=w&MKKqU2O)C~LBSOP?Z8dIG1uTbya&^1L{;M3Whu z25<4f>jrSeaEq-dwYW5=1U(>y(^E_06LWI%%TrV0A&I=$0u+iOpipE2g&z+i7b6UF zF;*#}h8-6DxU*XgIQ4=uTn$4O(?VuYB?!rGkmRGuT%-ib=bRt{RKViMQGzL%#b8H6 zO6JVeVpouxK~*gS6ANRNJgOTpRBJN%`DyYLiGqqVuK4)e{FKt1)cE*YJn`{`rHMJ9 z6c-emaB;#OWVdCQAVCG=vVCNCx;04S2X>#3?F32pg{vU|`Vf?~GAlVPJR+;=nKq0|SEt0|P^`1p@;^3PTEG4nrqT~O5^7RXfGRqQ6QuWIc zi}cg-b5c@^iuH|*^^MKU%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ zic1o6a&#>Wau*BSCU$kmzblUo1c=JQ>>o}iaou8$|80K1_qF8ig`fk zfr*cijggO$hmnW1N)#HK;K&DKET$U9g-pQ= znv8y$%tf3G3=Fr}ON(-{@-y?mzSd+a5&#LZfP$__2ow%rLKwsXxj__U9>{P8rYb2^ zCm@HqCOatB@)C1X}zQ_;|2Ci$Lbz;)RBH za%xUad_2Mlnv6w)AV+{*0!kJj-xafg!iR~4iH8@QRH_6sN=gcft@QOl5v`YBl&)VT z28!uoy@JY;jQqTe{Nj?-6p(}_BRGbu#9%r~Qj1IU5Za_cd|m8%{WRHc$rNN3=*5?% z=B4Bp=@n;I=;h{@r55W!(q<7TgdoAomY93iR2B_I~UcMulH cZ?`yXAc1Aa2nuRY8N|aZAjZVV#l*x20H!lJ8~^|S literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6abab81cd6ace09a8dd47f68cadbb266d113e2b GIT binary patch literal 5007 zcmZ?b<>g{vU|`Vf?~J)9#K7NGvK&)nvTIU65Fk5nqxYUs{x-$$X1H+{4w?C*Cz8#MLj@ z)8FrwL{Vx=Vsc4*L1J-nd45q!d|FX{E=ch$j^cux%#zfK5>3WiBHpQ$PKm{-DbD%1 z1&KwezL^!7d76y3gnT0dBIBJsT%En+gF^lMJpJ4?S#ELo7nEe?=OyOcVht%R$Vt7$ z8k(1xpLdHT1Y#P8M~JUaKw^4oGRV0w3<_EhyZ8$O14AkUC^(~-QW&F{Q#9Hc(il^i zQ&?I!qgYZ{Q`lMI=uD5WTa*%GPj zDJm(dV76o`dx~0$I+!ih&cMPDB^}J5sdAuK zV_;yYVO+qF!nlyJNT`IdhOwEkma&Ghh9RD*hN*@jp1Fp(NUerBk0}MjV<}-RVXI+i zX3Ao(VaQ@CVM}4|WnyGVVG3r@WJz4a$iM)$3}j(xQH~Xy0~JunPg5w#NL46GEzU13 zN={WM$j{6xNlj5G$ydhbhCqW@MwInemu_RF;Ei*MIMMt5yAT>ENEi*L*ZVkx$ znRyBUt^o?hCZ>7{AsLy)3b~1u3Q4I5)e1?K3W*9JgLGle(uFt+#hk>FlA_F{(vnn# z%sjAzKt6}0gp$N`9fibVg_P9dkfR4vwIEdm7|Bp6viVF?P=Tg=5JMVd@S;-G+M zDk>?FK=-q zB^HDA++r&Nl_LeW*h}*YOY=)oZ}B-67pE41>NnS-qWmIFR&c1?VvN7VmX}(Rlb?Kx z1#AQh$Vx~!A!3OG<`z3pV1b(%%wmipj9iRDut0;UfCm~VjzF0c9B81Fj0m(8MoCcO zV)82jDbi#vQUoOmB@h8hGdN<5tvER&H8<5A~f0J2>VVg<-{9P!MYT2T@O zw~4um1MFL5OF)|0VV(s!92C}|${r~{vedGcFf3rMVXR@QVXk3GVMt>Ihd-kqEa>5( zev7NLD5o?J>=#WoaK0$g1%(MH;=zG`i?y&cwW#tIM_N&0dTwf733>(*DJ{y02h~UU zr6ut&Me!g{fXZYBW--PpNw7DtsjK3TR#uBmO;5Mgh>lZ>)zXBACMYD~c?cA5pu!wh z^nltx#bTghx`uH9GboOcLYU>2KzwR?I>IeQskhjQQxl7lGa#h~YkEL%320yK1LQ$O(Y2R5we;p36M{UOOsMEi&B$I@{1~|>Ltl|WTTP& zR%8Z>FHqr8WDZJTkP4^B0wfA9#=r!);1|VeMj?jpq`XIvDI-%e5YN=ms3teXRMS=?I#D;xK-V%>n}j$ml0n2LD0V@)MjzxUmRlV08HvRi z@kOa5_?HEwr54qDT#QwaG6WjIRMoU%xQq`R@Nfli z=YfiBP|gPzEubvLF?E zpd@pP6_WL_7JRojiZk-dK|RY}kV`>1l7Sgk`axw-oCs0@b|R>n1m)Kf#%xgEgV9fu zsR-1}DFPJ(0G7}C=z26c22^Ar-3OG*=S z6cUR{GSd>1OB6Ix_0she5*11ki;@y^ax_6*mCQ7_ahWBk+LaQMic5+TlS`BoN-{wG zlAO%!RB*4bBm<;1Q6bDZSRp4rIT6$(LA3nAk)+9Zi@7Yh*eyhp<(6PUW`Q2OsjOF) zTwDZd-GU3~Til5`Iq{I{zZhDSL1e+%9ZZ1pJa=YsJj^H4K_Lq+$Jlw8co None + self.project = project + self.version = parse_version(version) # type: _BaseVersion + self.location = location + + super(InstallationCandidate, self).__init__( + key=(self.project, self.version, self.location), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.project, self.version, self.location, + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..971a391 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,73 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet # noqa: F401 + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set], Optional[Set]) -> 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): + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set], Optional[Set]) -> None + 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 + 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/index.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/index.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/link.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..ad2f93e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/models/link.py @@ -0,0 +1,163 @@ +import posixpath +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + WHEEL_EXTENSION, redact_password_from_url, splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple, Union, Text # noqa: F401 + from pip._internal.index import HTMLPage # noqa: F401 + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=None): + # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None + """ + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + 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. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + super(Link, self).__init__( + key=(self.url), + defining_class=Link + ) + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (redact_password_from_url(self.url), + self.comes_from, rp) + else: + return redact_password_from_url(str(self.url)) + + def __repr__(self): + return '' % self + + @property + def filename(self): + # type: () -> str + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + 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 = urllib_parse.urlsplit(self.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: () -> Optional[str] + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_artifact(self): + # type: () -> bool + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip._internal.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49a5539f450e848607de43e281599cb77de964c7 GIT binary patch literal 205 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKW%>n0 znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6RwdC?HF5v| literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8352b221322885cc28478ef9c094b2fad90a553 GIT binary patch literal 3635 zcmZ?b<>g{vU|`Vf?~D-?VPJR+;=nKq0|SEt0|P^`0wV)M3PTh_3S$aW4r3H!3S$a$ z4pT036f+}8j3tL9mo7X#wdYQ-l8Wdj47Nsg1JIbLSR)~Il{RjQ6jmbQKGqGQDV8`QR2B0Q4+b5 zQIfe*QBsTysbZtoWh;Llfs+M)XWs6l){(7-@*{3oFb7TkRsT^7^RXTlp@^15T%+T zk|Nr|5T%wPmLlH55T%~N6wIJ0S*0G9n3I{3Sdy8ar;wkfkdj)EnwOHAmz34CgUxxyu{qpl#}lZs1<5|c~fQ!B<0XXX`` zBU|`^8U|{eDrLH~(28J4jOonWxA|X%;OJSbFRLhXb zP|KLYSj$wARl<iQ_Eb!Si_vf)XZ4RQYlfwT*I8jQp3D}bsmKv5C)`g%H%Ua76&XB^E!dA;##~Q&9 z$xx^k!BD6c&QQZx!;}V!OZF-Y=lr~~)S{ANg+zs%%;FMI1cJgC9-0c7c_sM@i3(6p z2d9?kaVaP$D7dX;&}6#Bm6M;Gm=m9$ms5F*r8qmYph^`SaS8>AMa7wU=?X=VAOS^d zu|isYk%DTmm4a$C!tZt)Zp%q?O=K>{%?$ zjI|s!95oEt>_uHEEVZ09>{+ZSjMt(880;TR6wj!kx?ix0z7&Az$P$`_DhN*@bnsTQ*gMwBeGfg2;0UD?Z#i=CY1icoRMFelMxZyNQRaJ z3MCndB?={p*{Q_}iC{xuc7W28LSkNuLQ!f-X;B_1<0R$h=cFd)K{AG4G9xsGKr{#k zgJKAjic=Va88n&v+`ws3ld(t!mL$OfMRK65z>DHidyrOej5AhgfYTCk0@AYqXTM@Q zJrqqLnvA!&3yM;UQgc!hi&H@bB6D_Xr6w;ZOC*=vVlGZCDFSCLQ06NV16j+Kn^=^c zT6BvewJb5GG_fT07IR`s3OEsRhNi1dtR$M3{?G z3&Ejtiw&eQ72*&`D1ovtB&Y;20>m5?TqdC4XXjw#U}j@vW8z{0ksORnOahEt%p8m? zj9iRdj4X_Nj7-d2i~@`zOrUJW!YIO2WDLq)pa=sQ0E#bA0R;-8VlxH?22e(dVX9@U zWh!B;VW?qjW~yZ_VX9#Uu{s%Q7)zLI7~2`rK#c~b7LF9=UPuwkQkCkKU!(wbDyTrr zOj9VyNJUhdl?v%ai3J%7<)HKlN`r{RtB{yhl3D~RY!#q|4#B~?5ux{49$52i_IA98kFj^#Qn8jL%QIB^VDa z5D{(wg})}tEv}M$m{s6pb&E0nmJm32;*(NgGN~zGCu=emfubAYa&a8aOapm@2jmkr zE+#H!E@mc1CdMLbP;7$&3M|3Ez`zPCOnsoSUCUJA04_EyAk}d*;{v9I47DsJ%rz|F z!jZLvwT2~&t%hX*JG5eEwPC1XTEJ1m3NGAuKm`^k;H#XR^K%PIOHzx$kq>P!fa+Rk zwkU?iH8hk!@r(!sNV%fPS)>BWWFTi2NrPCRq*(;2HPCBJbx=!}t;hnT2$V5zaYD^a zO}WJZV#b5=7uXCeMNknawO50}j1L?%Y|LDYJd9k7B20WtU^#dd1ab-pgR7t*aH!QV zG=my5E;XQLj7=?b4RZ}sHd~QQAzy_~4PyiqsCZxk%WE?FX=>bJkB?8uPmYf-5(gD-+{yVl zIjPB@wqbD*DDm8qF32p%`8p^x1(-JVUsSYEXd4D zF9J0aZgHlkmiXkSr-MrIcyKWsAAgGt)T~M^ijqauU6fj=SCm=^%WOrUV&oPZ)HF^| zc!GLUMWCi_5h!C7@q)xa$)$)N#L{M9V2I*EG#R7VeIb=X6t^>?Qi$S)ih`QlQT#|U zU;%D$1s{}JT$)n?N#UUO54e;DXI^kx1jiI4Vo{^`7Kcr4eoARhsvRhria{xXg^7ca ohlvM*8F`pMZ7d!}6;>Wb9!5SU0Y(8v9wt6!4pAg{vU|`Vf?~KV*VPJR+;=nK`0|SEt0|P^`2_pkT3PTEG4nraTP}MPJ6J7C4o5C$6epO?n!}aL9mNf1v*qyQ z@<#FI@L`g6* zq)JR+ECSigog6a%g@V9PRz-yN{!D;%uUr~yd@fx zT3DJ{l$x8GR}zp|RGjKsRFq$&$#jd$DKW)4KQ}iqFXfh?XI^nhVopwCNoIZ?Oo3!3 zL@>T6wJ<)dC_gtoH6^noF)1hYmMDf)PG%m+HZEs>Utd?hkoX{1O{QA{DVfD3@tMU4 zjne6Am_4% z=4IyRX)@m83eQMQ&2dgl&Pdf{y2ay?SzH3M{uVb~=K*6=K3tmO@7$WviqC}GRy zDym~-0KpRW1so|XH9T3I3z--h$~__(@|YqRYS@ciN;O#rjO z;zemSLMfan46RI(3?Mhu3gt=F2$hJYa5OU_L>Gvqa4lr46)F+05vpOWVN2oeWv&&@ zlPZxYkz62^!c!x(kO`z4Ay*@u#XW(s_(BQ$0_haq8UcvE7BVw3fJOK~t}MI+QdPs9 z%|3ytNUDY(#FJ#0z*Niu4t@R_0W{Nvv$z+sFf!x`z|<~~sS$vfR3cl$4bk7s2nrRD z{~;o_44A6J8NwM-7y=oB7$O)7cZ4%kIF-mPkgwri2ueXFF-)~0wW1}WHKNUoDFWFn z6PSupz%CN35lInRpirV%!UK|PW?aY!^3epQ!jy1^6k(8^6*eV`HQWo77Q#vrv0f$@ zhFFzau@dDPu`KRp#u^T=e|MC~)`%h8I)Mq~juZw^dE-~bs+*>uT3jRrD%6>8apmME zC+5WG=jBx1VkyqfEV#v4TAW%07O0YU&M(bLQOL_LQ78bFF$zV9LdQx$wfGmKvL;Uz zlWtKJudXhVTosdUR284DZemV(Vr8*zX3Xd1|%kDC#I+RCFZ6ol;kUvWTYyD z2Kj)PiDmhjDGDVSnZ*j_iA8ytdFh%}PDlk8k`t04MPspoYO#(&QYk2Az@{pw7Aa&x z90heiYRXGS1_p*IZDfN~ixo2Sl5N zWhhuASU`n}_$_Xv^m2;} zl;h*UIlf35WSK0;C@xT06JL~?o?20)2ohBSi3+4vfYTyxWxi8 z=@u_Ep201f;#(}BP`$-mlv;R;KQ%YAq$D*ZJ|EnsD89uBZs%m?q!!=eg)!p`5=$~} zalp7>LsM^YfHFU*Sp*4jR#3h#zQu!V6*!4P2n~?S*dS>H6hp<6K&gg@gOP=ag^`De zi;<6!g^`VsiIInqiIES?V`AiB;$Y+g@tN3I*_c6Uco_K@xflf)1sGWvIXE~NLGo;j zOiU7tJd8q2QjAPs$i)mYgNc!YnS+sqk%@_iiG`7anTMGN%wuAdU>0H$VdP*`Vi95F zV`O8LVP<1yVH9H&U@VFNHF7{X668EkY=h$28I;QH7#SE!7-|@r8HdX|z6n2PTSQtt~vbiQO7V$7L)Uq=&R0)99a@DYdT3+D{DU2zMwd{555e$(G zd14U^HLNL&*`QXDQVlE246qLF8b*+g6dsT}Kw$;(izaVXHkX2ef`W5?Zb4~DszPF3 zib7FpNoi4@0whZ)XcVOu>L|eSvW`M>elDoZUaYB*mS3a*u1xa4Mqm^edhqf>LsJi| z#Luk=6p@-tx0uV4i*E@BrRL_Br26HTxaF7TrGOjwRmOh#3SrK{3TYrAupKbFQR=j6 z#iCk;%seXv5Ti<8S-}* zzD!HZ$pNWON=(iM)w`v6@W4sSFUn0UsnSI>c@XX`N-fAQ&Me6Ox_!bMuE4MiE@{4kl6N^)Cu_q=KLxf;f+!8FvEYO43 zTY6>5#YK^zqB4qsfgwr&)a3&CBQ-B2zNE4s^%h@ZF{to@^$Lp&Km`HW zU=v_T`xbL*MKYw21Xt_el2Qa@Gg7?}52|C9fQlhEP{G8;!N|oV#w5VV1uEGXSwLkc zGY=CN6BDBlBOfCNs7z(%Vgi+^OiZA1l#59SRQ54SFmpllFtITeWrE5&kZ~{!sF{Us?F{N;(Fr_fJFh((_vZS!2u(mKXGe)tdu%)oKFhsGXa0D}Gauw-; zyb5xDGN`f!nFpdltr~FI396SsWmr5z4O0z6JYx-W4MRLr4NDC}JTthZ&FH7e0r5IFpGcd6+f?$;tW^n;ioD6a# z%)y|@1Und%8cG;y7@HYmm}{A8nQK{Um{J(BIf~?J7(q?5TBaI?8pbT98m1cN8kQ8s zUY1}6O(s80#v-t*nZaROlnC+$D7|R1-eOM9DTX8qQ1l~wh~|qTeFg@GSD-imdw`jb zk%N(gsY)8t1Mu<=-jD?O1QhIGAAqa{H6&|6RR?2{ND5;OqZp{e&a{B3gt>+xi=~;d zgcan&bVhN8g^Vdo;-Cg6GpNgxs-RkYi;+u{4JkHUKz=a?5g;EHIe{XFsVEC10QL|l z@*#c!Ct&vY_~MeH`1sFouYhBMgRx2y(<@N5px^@;qsd;B3d$l}@$tF&DWy57@$t8K z;^PZT6LUZ<;rRHXY>+f}a!z7#ac*i!Mt%x7*oyK%t^t_oQQd*Q6A72Ct&mvQhRqUX~XJ%e{Q8dT~ZIBQ* zxVR}x%}dFLw)dowMDz;4y_d|qbiLA&%p6EtFG>N*Peua!U?XO;Kv0UUGh3aY<2Wa!GzsF`|VUC55RH)`Ww!UeT-rJ5(<> zvp5-C?m}ATXof)4lvILxe?`2YaA1RS_&_1U4LIgyJf(S8?CSg>k zfjgE(pfRQ*36L5|5CKYIw^)+$^K+v3kvayRpvE?5dTNOexIX|+Dd55z+;juyyIXAe zNuZtqIEuj$i$s9Z!z~UQNWucO=@^Qw7#J9Mm_Ut5P+sF<I&1!+csNv<*uI{=_i53K+I literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9dca4add631465f9ed93bed318f1a8590b21ecf GIT binary patch literal 10281 zcmZ?b<>g{vU|`Vf?~F-tWMFs<;=nKq0|SEt0|P^G93ulm3PTh_3S$aW4r3G}m}ZJ% zN?}Z4&SB1FiDJoRjbdd4$+P6J<+4YygW0S(9J!oPoVi?4T)Es)+_^kaJh{A4ykI%D z9KKxsDE?f5D1ltTD8XEzD4|^8C}FT1dyYu1Xp|_J&5#Q3mb|DPk$&Eet8*sRqr=QHJgeDH17?Eet7=V7`$%LyA<2bPGd@ zG?;Jf&X6LLBHO}{A`8}UlEM_spea|S8Bmm3kXV#jtdOXXl383*l$lgol9`{Ukd|Mh zkeOFpl9-c|2om6W35p;;O{QDC1=;EGMXAO4rA5i9#kV+$QVUB{i%W_%8E*+Vm1gFo zxaO5*7Uk#VrskDsvfkp#ERIjfEQ&8J%DKgzSsb61nUf0UfF#P2iy`dNyn@8!Y%rU< zv?wROBtO0&u_Qy2^_H|tW>IQ#Nq$jfXi<(wVsS=jUU6wbL4Hw5YRWAhh(JMRUS4X- zEkREt2fG#(0lH@uXxH7vv;Xg57zGFE76+H!&x(DizGv zWV|Kh8yOH8@9g2~>>VEz>gVU_=dQ_ki@7YhSd-}%vtwT6Ee`(zP{=0cfK)@B9+X;G znpuH*@@|?ZXlaMZsH2aEC^05F3!x)18G819a5B-oSj;f%m|7m1_lNY z&BVaK;0(%21`G@gH4Iq{MSLZUH4M#+!5|(}kxC6i7E=~;kxB^*L=+~Q!Whh;$yD{& zEfE~>3MKgpxry1S3W<3NiAlvJMTyBJ3ZT@Yke`&5np~pC#igL2pb$`$nw+1Pk_qxu zv6X^rW=TeB5lByJN@hu7QckKuQEH(=d1gt5LZSjB`G8V}jzWHsLUCeAW^r0(YD#=k zr9yrY*t|rA@{H8f9EF_Bylk+dM1{QkJYD>zLEU0ilv+|+lxL;jsF0kWmt2%ulB(d6 zSzO`>b$(`ko*vi|KTXzK955qqv3nK=gOuH30a<#BBeOUj>;{lTILI-eC@e}XT**+R z#K6Gtt5mDAzK@($vJ* zwA{eJz#zRqKSaMEvp^S`zjQ4Oau*BSCU$kmzblUUyxb^&VR-F1(2Mo zS5SFN2oxLfu&9U!MFq$?#o$tvlZ}ysk&lsssYr!^fgu^19>5eRL4eCv4F(2=RE8+V z6b4Xv8pWK#l)~J?5XF+hlET`;5XG9pmcrh`5XF|l5zL^;d5a$uCP+b-Sjo)50OJ=c zExlw_nrqpPeK98KVGQwT~e&d(`JEz$!O7&&FB8k!0@`RSR-&}a(DNChPdSduRW z7dwf0l_eROdFk--2b6RYi&7O5LGn2{`Q^n{;J8!JRVYtY$So}{QAkQv0H?5$e1(+M zlGLKy%)C^vn?R)#G(#!mCFZ6=G%6@)GMJHMbzYD6yzgA+tC?C$S_o1s0reH{=&7B<6tASxIJDYEGp> zSteMeLP2Ihv4VO^J}794OA?DpU|K;2m*(Z97Q@X*%*jEGKyW;jC1&P;qC;Jws5B>4 zL02IU>d^c&h4PHd;PS5~32$aH$6LUccHnBKA50o0QMzJPDJJz(B zT$Gwv0!k#H3}pH75G8U;ZFhB}cBqy?fN;faK^O&nd(47ZT zkjxAU5C#SY5RJ=e#;$qArA46Jomc`&J;{lA3hAjO3W*T+K_WS`7&)crfr1fKT52+b zU3ZHu4O|!B;!grKb>bnJD>FY2;$l!KTm%kTUQlrzpO#+)E}i|6+%JpneiW5{n(Uxh z0Tos8@wd3*<8$*;2MH8m_d`RNC8x}fWjFR z>>wJ{YzHR?F>rDyVO+pe!;r3rW3>vXTTAt1*|oUU=|xFtu17M>StNN4i@ED$QZ-a$xzGM!BCV}!;-?< z!O+aa$WX&tG^d1f0apqeNYz3nMg}mCJ%wWdcL`4kZwX%wYcpdr(?Uj&97s(TOTQE& zLkcH|9nTLUvji3hE@Y@>3uj1S2xJIihyc4Qi)8_O4I7fJPik0FxFEKIb%9-6!d0-=Qr5O*&S2C={ijn@yQ#0CYHFeq3-Nuz`z1>|YQ8io|61xz51w=k42cQ7(w? zi}k9QbQIuaH>iLFCAngd6Xd`hgIKW`rdq~YrWA%6#u}zHCNYLE21bTLCTNK+rCO|z zS*(zmmzBSc%W)`Q$C+FvZy;h8nfg7jE zQp5wwa-a(D7E4xsX5KBfVsIBxlPO97rZY1yJs#w6RFR_8LQt2C8%Y(os7JW_mH@gF z3P8>WWh@3pCPpSkE=D%SDt!{Y5yhTgmRgjPSXm_t?fik7SC~;-r4-;ApkQifu5W5+ zp#bl%BG*#IRVL8RDl};zwR%Ajr%+H?P?Qhus+HvD=0FpRUR469{SB2-NXbtHwcJY- ziVIScGt(*+5}}4AfqIsCDLM*?c`2Z_p+a(EUS58QLK>*?2a*J}M8OR-NM#QSVo=)( zl=4`?nyQrDQ%g!f-a~O%Nj}sDa9^QH0@T6+nU|WEf|9tS*dV>@DtY99g18Drp{59= zWE0NGPfUr2dpaKE>04Z-#i{WHsRgEn=0%_kaElWh*72!%Ww%72NjDzZeYb=VCP2lD zqlA((Qj@b$)rmr7LA~~3(9i`~%`LW^{PgtHqFe0ciA8ytdFe$Kpe7e{ZeqbLmZH>x zq9RKWpQpGWGcP_jwYWGjJ@pnJ#DVe9V7Mg%Dx;ys7lWG<5J!VUEJ^^BV-kx}<6#ZN zTe6A8#i>Ol@zA<6H?br+BegibEVT$cX21?f+3>pV7GH4&s9ynX$D|fngPg>k3mN$U zIkT`BoDVdaimX5x4BSEk=+s3)Y2~BOODe%G*)O-P9aK#F0O@T&LvOuFHh-#Gwc`O4@)w%@a zQcw}dz*NNtw+gj#1r^qC`#`<|*8_~OVizqo!7&9P;8C;!$rf>hEtCbcF9QR^B9Or# zCvh-wuoQtrPy!m{a!|r3c0p-OMlrWDq%ner8#tm^QduDb4$X{FY|tSG_7sj3&K8C! zjufsG?iPk9&UOYChA6IJ22Gw@!bsy?&~eM6DrqPSG=hmF5AHxEgQ5uJ3J?u)5eOH1 zKwGFa49!dnm_XHZ4RZ}cJTtiW#8Sgv!w}C}!&Ji%&sM`yWK_al!_v%H%TmKq!w}C= z!&<`-&soD(!w}B}jSEfgTdc*U1*t_v{-7KJYLDMyFD^<3jcvion3T+-Tiivdh4G-V zv+UHOTRbWG<$2&zDkZb12-F<7B?QjX@yHUlcnXU0(~DAzi{q0Li;A>C-8l|Oqz8fQ z3IP#;AOh5qED8g$K#GcjK`I$~@Lr7$gIWMn8|Phl?M0Le8oLfbej!3>(Lej!zg&Y&_$0bIvqg6aZjSSh5y zhJvdM(3F72GLn;1i;ERt;fGMHpsrf1?xx9E1P(5KPzlGBUwn%NG{Ag|Ewv)ExTLtq z2_(#sT$EXonVgsdX-x=$LlF|*sGWjaqKJ5cmY~InWvSOe!3xsFz{1AJ!^p?T!o&q` zAn-9(X<`jjm}}#aOi5+~MGON211|#u12=38_Xi^bLk(jVLy-Z9%wkMo%w{SwC}9Hg zn41}E*-BUzu%{HnZj74HK3|Vq8x|S0z zZcxKHfw4#jq&ANwg`<|ML>?pu@5I$)N(U2RH>D)EKpA2s$s0*2Klo@C50Qr2AKnEi-$9$@TBn6a@TQ3FhnxsF-0(x zsMatxGuHCdFl4DMP_JQJ$k;E!$WX(xKm$~=WNCuB9w1$i&P5GFmevHuqE{d@vlvUX zvvjiAAp8ZoAm4)G1xYneFoPy6jdrD zrYC0R>1i_F;wvdCEiQo$zNeOixM?!qVlReFx7=dONG#4sEe02|RVIky2ikH3g*I#$ zTR|1%$mGP*;#AN;a4KjfN!Bq#SL3T?D)a(Ma*FgcAnu6Smcm}FEGC&1Cj}RjdqYx7h z6BjEFy9B8EVC7@tJ|+=H5D%n+iIIs(3DhWOlwjmw5?~Z#tkT0)A>nplGAM#U?gPa(D4xOf zKBy53D#wcXN*GfZLG?rl(*oucCTN|*(#+6b#mG>@RAf}bn!;QIt?6qR7qHbZWU+%v zI#_MQ!vNxyaDhuw)*1#-y#y~wSr_nv+Fx0G(2|q|UXpSa_0%vf;ICoG5&-G1VO$_s z!wh1DGo-*&frczut2E#xXr2OW!Vfvu!i&i&U1$dv8W;*#<{cA@;bv6v_=AgGP`RU8 zT$K;%Q)4q9R4PCXPD+K9a-cFbBQ+1|4v-O$Vn#LE|rZ`3j)fft*wY zP$>@TbAy!X`DqFjfyM`m(m-h%)Ql+tHN?T0AJU8gjo}r6T8W^d7 z!n}uUbTX)^3QE49WDF`Y!O0gCW~j-xhB<{Po3mK0gb|cnvl!B#Nfw-}S!zI?1ja0e zEEdp+UkPh7L%$3-c?Xm*EnrJw1tq)^c5o7A31>)Qf+kZ?!sE6D=1*NOv)Dlo)QZ1?yM+#Kv*r5Wb(ym$_oSB!Ls*nk? zOabb2L<$Da#DV7hz||)x4VQrGc4gx13kZfj2u>v^hDum=KKx!w2LNb*{G12SCS82SCCs!0-CifDk)9ONzE(M)8r`f1Eo1o zw1R6xa8|g*4jujg=ZRaaDXB@N>EIr#CM$X}<_3jUd{HVW=SlN)_%0koh4Jo9sl zqo4@1Mxdk;l9!7>-Y)|YRp49+?EogH=H$RSfuOvo$yfxMH~~*pfxE41LDdhahUH*l zVd7Ea;peF1Py)+nnihds>Lff^0BxC=51^y14>^HTDQ!1FkeI$Inp3|qaR z2W|m^2G}42Zepmiu)YtZ=>V!$AZ-e8I{=hLZ%LqPNUcat1uvN?E&^3Rkmdx)(ctz9 zxGi!^3RO#KNoG#59w==kmK1@zepnTNl4ELd5vWyiOB$OAFwcXVRA|nE*pZuAoD6Ap zfqU~eZohe1OL(4 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 RequirementParseError as e: + # Don't crash on broken metadata + logging.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. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = dict() + conflicting = dict() + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # 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]) -> Tuple[PackageSet, CheckResult] + """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[str] + """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: + dist = make_abstract_dist(inst_req).dist() + 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[str], PackageSet) -> Set[str] + 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..388bb73 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,247 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import 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.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._vendor.pkg_resources import ( # noqa: F401 + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + if exclude_editable and req.editable: + continue + installations[req.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 + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + 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, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + 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)" + ) + elif line_req.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.name]).rstrip() + del installations[line_req.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 six.iteritems(req_files): + 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 canonicalize_name(installation.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 vcs, RemoteNotFoundError + vc_type = vcs.get_backend_type(location) + + if not vc_type: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement {!r} in: {!r}', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vc_type.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + vc_type.__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, + vc_type.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: + if req is not None: + 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(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..4f31dd5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,413 @@ +"""Prepares a distribution for installation +""" + +import logging +import os + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import BuildEnvironment +from pip._internal.download import ( + is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, +) +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, + PreviousBuildDirError, VcsHashUnsupported, +) +from pip._internal.utils.compat import expanduser +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_tracker import RequirementTracker # noqa: F401 + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + # type: (InstallRequirement) -> DistAbstraction + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req.editable: + return IsSDist(req) + elif req.link and req.link.is_wheel: + return IsWheel(req) + else: + return IsSDist(req) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + # type: (InstallRequirement) -> None + self.req = req # type: InstallRequirement + + def dist(self): + # type: () -> Any + """Return a setuptools Dist object.""" + raise NotImplementedError + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError + + +class IsWheel(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self): + return self.req.get_dist() + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Prepare for building. We need to: + # 1. Load pyproject.toml (if it exists) + # 2. Set up the build environment + + self.req.load_pyproject_toml() + should_isolate = self.req.use_pep517 and build_isolation + + def _raise_conflicts(conflicting_with, conflicting_reqs): + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join( + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting)))) + + if should_isolate: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, self.req.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: + # We need to have the env active when calling the hook. + self.req.spin_message = "Getting requirements to build wheel" + reqs = self.req.pep517_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" + ) + + self.req.prepare_metadata() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + progress_bar, # type: str + build_isolation, # type: bool + req_tracker # type: RequirementTracker + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + + # 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 + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + self.progress_bar = progress_bar + + # Is build isolation allowed? + self.build_isolation = build_isolation + + @property + def _download_should_save(self): + # type: () -> bool + # TODO: Modify to reduce indentation needed + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + session, # type: PipSession + finder, # type: PackageFinder + upgrade_allowed, # type: bool + require_hashes # type: bool + ): + # type: (...) -> DistAbstraction + """Prepare a requirement that would be obtained from req.link + """ + # TODO: Breakup into smaller functions + if req.link and req.link.scheme == 'file': + path = url_to_path(req.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req.ensure_has_source_dir(self.build_dir) + # 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` + # 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 '%s' due to a" + " pre-existing build directory (%s). 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." + % (req, req.source_dir) + ) + req.populate_link(finder, upgrade_allowed, require_hashes) + + # We can't hit this spot and have populate_link return None. + # req.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req.link + link = req.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # 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 is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # 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. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # 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. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req.link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req.link, req.source_dir, + download_dir, autodelete_unpacked, + session=session, hashes=hashes, + progress_bar=self.progress_bar + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because of HTTP ' + 'error %s for URL %s' % + (req, exc, req.link) + ) + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if req.link.scheme in vcs.all_schemes: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + require_hashes, # type: bool + use_user_site, # type: bool + finder # type: PackageFinder + ): + # type: (...) -> DistAbstraction + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(use_user_site) + + return abstract_dist + + def prepare_installed_requirement(self, req, require_hashes, skip_reason): + # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction + """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 %r" % (req.satisfied_by,) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if 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.' + ) + abstract_dist = Installed(req) + + return abstract_dist diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..1e782d1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,381 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc +from pip._internal.utils.compat import get_extension_suffixes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Tuple, Callable, List, Optional, Union, Dict + ) + + Pep425Tag = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + # type: (str) -> Optional[str] + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + # type: () -> str + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + # type: () -> str + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + # type: () -> Tuple[int, ...] + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + # attrs exist only on pypy + return (sys.version_info[0], + sys.pypy_version_info.major, # type: ignore + sys.pypy_version_info.minor) # type: ignore + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + # type: () -> str + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + # type: () -> Optional[str] + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + # type: () -> bool + return sys.maxsize == 2147483647 + + +def get_platform(): + # type: () -> str + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def is_manylinux2010_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux2010_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 6 uses glibc 2.12. + return pip._internal.utils.glibc.have_compatible_glibc(2, 12) + + +def get_darwin_arches(major, minor, machine): + # type: (int, int, str) -> List[str] + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # type: (int, int, str) -> bool + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) # type: Dict[str, Tuple[str, ...]] + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_all_minor_versions_as_strings(version_info): + # type: (Tuple[int, ...]) -> List[str] + versions = [] + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + return versions + + +def get_supported( + versions=None, # type: Optional[List[str]] + noarch=False, # type: bool + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Pep425Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform 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 abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + version_info = get_impl_version_info() + versions = get_all_minor_versions_as_strings(version_info) + + impl = impl or get_abbr_impl() + + abis = [] # type: List[str] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_extension_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + 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 = [arch, 'manylinux1' + arch_sep + arch_suffix] + elif platform is None: + arches = [] + if is_manylinux2010_compatible(): + arches.append('manylinux2010' + arch_sep + arch_suffix) + if is_manylinux1_compatible(): + arches.append('manylinux1' + arch_sep + arch_suffix) + arches.append(arch) + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..8d739a6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,171 @@ +from __future__ import absolute_import + +import io +import os +import sys + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Tuple, Optional, List # noqa: F401 + + +def _is_list_of_str(obj): + # type: (Any) -> bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(setup_py_dir): + # type: (str) -> str + path = os.path.join(setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[Tuple[List[str], str, List[str]]] + """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 + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.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.", + )) + + backend = build_system.get("build-backend") + 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 (requires, backend, check) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..5e4eb92 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,77 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Sequence # noqa: F401 + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, **kwargs +): + # type: (...) -> List[InstallRequirement] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.conflicts_with and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.conflicts_with and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + requirement.remove_temporary_source() + + return to_install diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c79c22eaf234bcb092eac5a78ee85c19c65e9f GIT binary patch literal 1702 zcmZ?b<>g{vU|`Vf?~GCBWMFs<;=nKq0|SEt0|P^G2Ll5`3PTEG4nr(!Io!ECQ9O(c zsXRp~DGVu`IlQ@iQGB`lQT&VyDO@SsDLg5>=`2wKsZ0w5Q-u~XMhT|~r0}QkwlGGC zq%Z|DXbQdrxlfbv7Jp(=aehu|Noss%Zb5!giQh{`kWUzI33=ufmn7!o1f>?1W)`L9 zrskDsGT!1t;s&RJM1%?wi;7d@ixA3+H5qSlW#*-%=9R?fg;^Yip`*JQfI;*(iia*HE4wXifbFFCb{m4Shw2ozjJYzzzxw}dhw4v0_BEKAJ; zSx~%^A(0@MM2xrJMU|}d>&*myx!^i-FAd~ZF)Ual8 z@G#V}*RU5Yt6^KfxsZX8p@|`qAx|m-WIjv&4v>mkjv9`lV>N6GxIpqXtP8k7bfI22 z1H#@KhF}Iw&Z<%_1qB5KXuK$-mZcU|mSkk+r7L9SDU@WSDu4q@At$rAM2`!sRHGzc zAt_ZMIWZ?EHANvYtt7QbAtSL2q$MT4JTE6dF$E-^m!eRbSCE*TotgqR2gFQFPc7C2 z8&ahRwGpH(IX@>SHMt};MFFPBNu;q%oGf#N1R(rdv#U2Dg}tQVYT2VB%N4enC-YSz<}5epzCX zep-G`N@`KDzLBxMv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|E;Q-r zS{USJXJi}YfCRxfJ~OW*wJ0w!N53ewP(MCCGcU6wK3=b&@)ws4DBzOwa|`U$KrRP) zgN>m|4QdopD%7*d$xlwqDYnx?XsMES%P-AKQAn-GEG_{B6jWPcNoIZ?D2PHd8E^3< zmX_qlC+Fv-WftZ7Y4Y4+%gIkqPc6E|l9`v5e~Tq6KQph09hCO@K#FoQlS_)@%QH(d zZgH08K@Ggc4r6e-RwSnufXu%o2o;MjE=^8OO-)Hnxy4bGpOcf6n4Eo!Ejd3oH?!oH zcu{I@epzaKNh&C#Cl*!47w4B2C8ug~-r_3BkB1s@iyz8}&j*`be2XtVCqF4M2hL|n zEJ`oF#g<(Trn!+a{w-m+GgDLI3ld8*ic?E&@fT<0m*%9z!yUv66@a)49NiE?08{{g zGPM{e0_;GEiI;_ug^`I-jG2Rxi;)e?=3wGrWMLFyVgmC(@?1=OOl*uC%q)x?j2z5t zjBHFGmKc*JBiLL`(OX>c@oA+crA4Xn@kOABy~Pd+`OLiZTOjwt{0=UBZm}1o7RDE+ zmVnEnTO1%>T4qivq)?JB$SlxTZlX-=vg cDEk#lFfcIiFmW*PFhU^{3!?xiT$s7o0K`_{m;e9( literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81bfd317164711ec685a59e9bd0699500df55ee0 GIT binary patch literal 7622 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098d460a399f09104d02fbadfb9035a25d423b71 GIT binary patch literal 9200 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 bj0ni3%pr{6F)(tKatLuqa>#M;aPR>D2bnP$ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..628dc525d3204325b55aaabfc31cdad2c020eb3a GIT binary patch literal 25037 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 KB%pj|E@l97qeprG literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fd341601c92d006ceb1b5cba2fc608b0e9ac1a3 GIT binary patch literal 6037 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 CpeL&U literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b75d61f4f63f4de8dffebde40b8535342c5229d GIT binary patch literal 3151 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 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 parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[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): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" 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 setup.py 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, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '%s should either be a path to a local project or a VCS url ' + 'beginning with svn+, git+, hg+, or bzr+' % + editable_req + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return package_name, url, None + + +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 = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + name, url, extras_override = parse_editable(editable_req) + if url.startswith('file:'): + source_dir = url_to_path(url) + else: + source_dir = None + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + return InstallRequirement( + req, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + +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]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + 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) + looks_like_dir = os.path.isdir(p) and ( + os.path.sep in name or + (os.path.altsep is not None and os.path.altsep in name) or + name.startswith('.') + ) + if looks_like_dir: + if not is_installable_dir(p): + raise InstallationError( + "Directory %r is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." % name + ) + link = Link(path_to_url(p)) + elif is_archive_file(p): + if not os.path.isfile(p): + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + link = Link(path_to_url(p)) + + # 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 = "%s==%s" % (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 + + if extras_as_string: + extras = Requirement("placeholder" + extras_as_string.lower()).extras + else: + extras = () + if req_as_string is not None: + 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 = "" + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) + ) + else: + req = None + + return InstallRequirement( + req, comes_from, link=link, markers=markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if req.url 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" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..726f2f6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,382 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Tuple, Optional, List, Callable, Text + ) + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + ReqFileLines = Iterator[Tuple[int, Text]] + +__all__ = ['parse_requirements'] + +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.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] # 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] + + +def parse_requirements( + filename, # type: str + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + use_pep517=use_pep517, constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + # type: (Text, Optional[optparse.Values]) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def process_line( + line, # type: Text + filename, # type: str + line_number, # type: int + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] + constraint=False # type: bool +): + # type: (...) -> Iterator[InstallRequirement] + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + 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. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser(line) + 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) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number, + ) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield install_req_from_line( + args_str, line_comes_from, constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + yield install_req_from_editable( + opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + constraint=constraint, isolated=isolated, wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = 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) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parsed_reqs = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parsed_reqs: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.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 + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """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) # type: ignore + + +def build_parser(line): + # type: (Text) -> 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): + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(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[Text] + 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) + 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: + 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 skip_regex(lines_enum, options): + # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) + return lines_enum + + +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 discusssion 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 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..a4834b0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,1021 @@ +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import sysconfig +import zipfile +from distutils.util import change_root + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +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._internal import wheel +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.models.link import Link +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.compat import native_str +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + _make_build_dir, ask_path_exists, backup_dir, call_subprocess, + display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, + get_installed_version, redact_password_from_url, rmtree, +) +from pip._internal.utils.packaging import get_metadata +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Iterable, List, Union, Any, Text, Sequence, Dict + ) + from pip._internal.build_env import BuildEnvironment # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._vendor.packaging.specifiers import SpecifierSet # noqa: F401 + from pip._vendor.packaging.markers import Marker # noqa: F401 + + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relavant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + update=True, # type: bool + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is not None: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + else: + self.source_dir = None + self.editable = editable + + self._wheel_cache = wheel_cache + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + 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 + + self._egg_info_path = None # type: Optional[str] + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = TempDirectory(kind="req-build") + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None # type: Optional[str] + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled_pathset = None + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + 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 + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % redact_password_from_url(self.link.url) + elif self.link: + s = redact_password_from_url(self.link.url) + else: + s = '' + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + # type: (PackageFinder, bool, bool) -> None + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If 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 self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.get(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return native_str(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 {'==', '==='}) + + @property + def installed_version(self): + return get_installed_version(self.name) + + 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.options.get('hashes', {})) + + 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.options.get('hashes', {}).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, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + # type: (str) -> Optional[str] + assert build_dir is not None + if self._temp_build_dir.path is not None: + return self._temp_build_dir.path + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # 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.create() + self._ideal_build_dir = build_dir + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # 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) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + # type: () -> None + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.run_egg_info to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir.path + assert (self._ideal_build_dir is not None and + self._ideal_build_dir.path) # type: ignore + old_location = self._temp_build_dir.path + self._temp_build_dir.path = None + + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir.path = new_location + self._ideal_build_dir = None + self.source_dir = os.path.normpath(os.path.abspath(new_location)) + self._egg_info_path = None + + # Correct the metadata directory, if it exists + if self.metadata_directory: + old_meta = self.metadata_directory + rel = os.path.relpath(old_meta, start=old_location) + new_meta = os.path.join(new_location, rel) + new_meta = os.path.normpath(os.path.abspath(new_meta)) + self.metadata_directory = new_meta + + def remove_temporary_source(self): + # type: () -> None + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + self._temp_build_dir.cleanup() + self.build_env.cleanup() + + def check_if_exists(self, use_user_site): + # type: (bool) -> bool + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + 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 %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + def move_wheel_files( + self, + wheeldir, # type: 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 + move_wheel_files( + self.name, self.req, wheeldir, + user=use_user_site, + home=home, + root=root, + prefix=prefix, + pycompile=pycompile, + isolated=self.isolated, + warn_script_location=warn_script_location, + ) + + # Things valid for sdists + @property + def setup_py_dir(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + return make_pyproject_path(self.setup_py_dir) + + 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. + """ + pep517_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + if pep517_data is None: + self.use_pep517 = False + else: + self.use_pep517 = True + requires, backend, check = pep517_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner(cmd, cwd=None, extra_environ=None): + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + show_stdout=False, + spinner=spinner + ) + self.spin_message = "" + + self.pep517_backend._subprocess_runner = runner + + 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(): + if self.use_pep517: + self.prepare_pep517_metadata() + else: + self.run_egg_info() + + if not self.req: + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + 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 prepare_pep517_metadata(self): + # type: () -> None + assert self.pep517_backend is not None + + metadata_dir = os.path.join( + self.setup_py_dir, + 'pip-wheel-metadata' + ) + ensure_dir(metadata_dir) + + with self.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. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + + def run_egg_info(self): + # type: () -> None + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] # type: List[str] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + show_stdout=False, + command_desc='python setup.py egg_info') + + @property + def egg_info_path(self): + # type: () -> str + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + "Files/directories not found in %s" % base + ) + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return self._egg_info_path + + @property + def metadata(self): + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + """Return a pkg_resources.Distribution for this requirement""" + if self.metadata_directory: + base_dir, distinfo = os.path.split(self.metadata_directory) + metadata = pkg_resources.PathMetadata( + base_dir, self.metadata_directory + ) + dist_name = os.path.splitext(distinfo)[0] + typ = pkg_resources.DistInfoDistribution + else: + egg_info = self.egg_info_path.rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + # https://github.com/python/mypy/issues/1174 + typ = pkg_resources.Distribution # type: ignore + + return typ( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + 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): + # type: (str) -> str + """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.build_location(parent_dir) + return self.source_dir + + # For editable installations + def install_editable( + self, + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + prefix=None # type: Optional[str] + ): + # type: (...) -> None + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + with self.build_env: + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + show_stdout=False, + ) + + self.install_succeeded = True + + def update_editable(self, obtain=True): + # type: (bool) -> 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 + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + # type: (bool, 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. + + """ + if not self.check_if_exists(use_user_site): + logger.warning("Skipping %s as it is not installed.", self.name) + return None + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _clean_zip_name(self, name, prefix): # only used by archive. + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + path = os.path.join(parentdir, path) + name = self._clean_zip_name(path, rootdir) + return self.name + '/' + name + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + # type: (str) -> None + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (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 %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + 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 create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + 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.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + file_arcname = self._get_archive_name(filename, + parentdir=dirpath, + rootdir=dir) + filename = os.path.join(dirpath, filename) + zip.write(filename, file_arcname) + zip.close() + 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 + global_options = global_options if global_options is not None else [] + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix, + ) + return + if self.is_wheel: + version = wheel.wheel_version(self.source_dir) + wheel.check_compatibility(version, self.name) + + self.move_wheel_files( + self.source_dir, root=root, prefix=prefix, home=home, + warn_script_location=warn_script_location, + use_user_site=use_user_site, pycompile=pycompile, + ) + self.install_succeeded = True + return + + # 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.options.get('global_options', []) + install_options = list(install_options) + \ + self.options.get('install_options', []) + + if self.isolated: + # https://github.com/python/mypy/issues/1174 + global_options = global_options + ["--no-user-cfg"] # type: ignore + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = self.get_install_args( + global_options, record_filename, root, prefix, pycompile, + ) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + with self.build_env: + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + show_stdout=False, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + 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') + + def get_install_args( + self, + global_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + pycompile # type: bool + ): + # type: (...) -> List[str] + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..d1410e9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,197 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Dict, Iterable # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + # type: (bool, bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} # type: Dict[str, str] + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + 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]] # noqa: E501 + """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. + """ + name = install_req.name + + # 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", + 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) + if self.check_supported_wheels and not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_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.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + # We'd want to rescan this requirements 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: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + 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, project_name): + # type: (str) -> bool + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + @property + def has_requirements(self): + # type: () -> List[InstallRequirement] + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + # type: (str) -> InstallRequirement + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def cleanup_files(self): + # type: () -> None + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..82e084a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,88 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Set, Iterator # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + # type: () -> None + self._root = os.environ.get('PIP_REQ_TRACKER') + if self._root is None: + self._temp_dir = TempDirectory(delete=False, kind='req-tracker') + self._temp_dir.create() + self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path + logger.debug('Created requirements tracker %r', self._root) + else: + self._temp_dir = None + logger.debug('Re-using requirements tracker %r', self._root) + self._entries = set() # type: Set[InstallRequirement] + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + 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 + link = req.link + info = str(req) + entry_path = self._entry_path(link) + try: + with open(entry_path) as fp: + # Error, these's already a build in progress. + raise LookupError('%s is already being built: %s' + % (link, fp.read())) + except IOError as e: + if e.errno != errno.ENOENT: + raise + assert req not in self._entries + with open(entry_path, 'w') as fp: + fp.write(info) + self._entries.add(req) + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + link = req.link + self._entries.remove(req) + os.unlink(self._entry_path(link)) + 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) + remove = self._temp_dir is not None + if remove: + self._temp_dir.cleanup() + logger.debug('%s build tracker %r', + 'Removed' if remove else 'Cleaned', + self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..c80959e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,596 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, 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): + """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 = bin_user + else: + bin_dir = bin_py + 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): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + """ + 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(FakeFile(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): + """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() + 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): + """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 = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() + + def norm_join(*a): + 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() + all_subdirs = set() + 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): + """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 = list(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) + + _normcased_files = set(map(os.path.normcase, files)) + + 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(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] + + def _get_directory_stash(self, path): + """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) + save_dir.create() + except OSError: + save_dir = TempDirectory(kind="uninstall") + save_dir.create() + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + """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') + save_dir.create() + 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): + """Stashes the directory or file and returns its new location. + """ + if os.path.isdir(path): + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if os.path.isdir(path) 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): + """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): + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logging.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): + 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): + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + 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' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + 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): + """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): + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + 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 = list(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): + """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 False + 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): + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + 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, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (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 = bin_user + else: + bin_dir = bin_py + 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(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + 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. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.debug('Removing pth entries from %s:', self.file) + 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): + 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/resolve.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/resolve.py new file mode 100644 index 0000000..33f572f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/resolve.py @@ -0,0 +1,393 @@ +"""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) +""" + +import logging +from collections import defaultdict +from itertools import chain + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.req.constructors import install_req_from_req_string +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, ensure_dir +from pip._internal.utils.packaging import check_dist_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, DefaultDict, List, Set # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + +logger = logging.getLogger(__name__) + + +class Resolver(object): + """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 + session, # type: PipSession + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + isolated, # type: bool + upgrade_strategy, # type: str + use_pep517=None # type: Optional[bool] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + self.preparer = preparer + self.finder = finder + self.session = session + + # NOTE: This would eventually be replaced with a cache that can give + # information about both sdist and wheels transparently. + self.wheel_cache = wheel_cache + + # This is set in resolve + self.require_hashes = None # type: Optional[bool] + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.isolated = isolated + 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.use_pep517 = use_pep517 + + self._discovered_dependencies = \ + defaultdict(list) # type: DefaultDict[str, List] + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """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. + """ + # make the wheelhouse + if self.preparer.wheel_download_dir: + ensure_dir(self.preparer.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + self.require_hashes = ( + requirement_set.require_hashes or + any(req.has_hash_options for req in root_reqs) + ) + + # Display where finder is looking for packages + locations = self.finder.get_formatted_locations() + if locations: + logger.info(locations) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.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(root_reqs, 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 + + 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.is_direct + + 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.conflicts_with = req.satisfied_by + req.satisfied_by = None + + # XXX: Stop passing requirement_set for options + 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 _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> DistAbstraction + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + assert self.require_hashes is not None, ( + "require_hashes should have been set in Resolver.resolve()" + ) + + if req.editable: + return self.preparer.prepare_editable_requirement( + req, self.require_hashes, self.use_user_site, self.finder, + ) + + # 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, self.require_hashes, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + abstract_dist = self.preparer.prepare_linked_requirement( + req, self.session, self.finder, upgrade_allowed, + self.require_hashes + ) + + # 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 abstract_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 + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.dist() + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req_string( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + use_pep517=self.use_pep517 + ) + 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 + req_to_install.is_direct = True + 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) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + 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): + 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f010bcd1fc51432dad4b9bd8a2e082e32e68ff3 GIT binary patch literal 200 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKh57|W znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6RwI&){l?R%*!l^kJl@x Uyv1RYo1apelWGTYN-@Z}0JFg}S^xk5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee8604222990abbed5e784ac1bc106cae0f6b3c6 GIT binary patch literal 8047 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be137cfe94d6b6ae414fa50eb69679e02fc6431 GIT binary patch literal 6148 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 w*g4ohS%Hm-g_*;ghmnV!i-SXshmnVgi literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a4cb9a29cc2c7f132e1d7d3ece43302fd3a5687 GIT binary patch literal 2574 zcmZ?b<>g{vU|`Vf?~HlE&A{*&#DQTJ1_lNP1_p-W9tH-66ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k^MiY0|Hg(ZhImo177EXSI|p34!%31+k9aOHAGaWgWcau-FUFs88Q z@Z|DF@#gYH@i8*EGo)~&aJDd{aHjG%Ge-%eFeeJ82&8bOaJMi<38nC)@U}2S38x6A z@TKs#Fh+@_Fb6Ye3RU@WIV$AlrTio&SWvNBQnfZC~@tTacgnT0dBIBJsT%En+ zgF^lMJpJ4?nQk#V=2hO}@Gk%voS2ggG8cv!Vd2Tcz`&5o5XG3n5XF?j7|fu_bW1cK zv%m%6q;QC1{WO_xam2^xCFZ8a$KT?LkIw~rIX?atPkek~X<`mUW+g)r$Vf2pt3DAzK@($vJ*wA{eJz#zRq zKSaMEvp_d9uec;JCr8)9AU8WB+b9Pl2*&Z5c_pbud5Jmtr6rj;#rjC$r&mx}#KFM8 zAOuP)ObiSR9E@OoG8@$A>005FfL@QWvgLZz*@twkdcugPY6>_3Iix8{i>u2 zG7I$J?$twbX|X2TEz$V=qRjNnyu_UN;*9)qXtKD)m04U|nv|TASX>Nt{4MsJ{Pgt9 zy!2a~>8T|?`RVDYMYq_Ysx{efvFD~17bm8t-r`73EJ;nzFRHx7k(Qa03W||iY&n^E zsd@RgSU@7TSU|j6Y#{Sei@=ctA$S=W7;f<(yFv;SK%ih`VB}!rU}RzxV&Y=vV&q|B zVk`p5p(H0(1_lOjh-xq}FqAN4F{Uthk-3Dmgdv^< z96l_5x7brs(-KQ_N*XtLenfcmZY7EduaH>G9fl%y7c1EYu!6}X2= zK;;c%4TCsCElUk!3R5;`kz5T+3iASn8pef;<{(jKu&6@{O9^8Qb2FnjLoI6!OA6}( zh8k9=3MR0Mgc7C_=4QqcrW&SZ#%$K2gc6n-mS)B##uC;nwi=camK3%Wc2Iz&Fa-S_CbE$}=hzN-{Ew6;RAn$Ve=Po0OEAng=hc zQd9K65=E&6If=>O(hk$k;?nf=)MAhe@z|SKqL2uR+`Pn+%(7Ilp&)mox}zi`wNfED zF%RTqh{fsod8zT4$R5o|Re%4Y57HPJ3z4rs%aF`GV@Xtic)hDOHxx5QZkE^ON&7j zghFCoib6qAepzNpszO?7YD!XKayB%zIOdcmRu(H1Bo-GdAVsB)0yKERdcjTyIU+l? zvOK>iMIo^$y%bWvrR5hXBpepPY`jtT|&#l@MR8WG7}h0J1w>RP=j<&2V&f?_Lu{q)R|jM5~%}%1tb}#avucRKyID=Z8i%tdfP4JhC7u7EoED$##nklGAQ+Bf0+; zJ2c#Gv4UM$Bn;BQTw0WaR6K!8CN6k(PB90SM&N>05>(LgF>)~SF!C`=Fmf;!>44fp zOn!cvjDDJ;x7g$3Q}UA`wQpK!Noi4Pe0&keTSWp43=Bme=S9haE1a^_yp;SRy@JH# z>_kw-p$E+w5Z^HuWEK>GO1mOeko(Z;C~%#sS5jG!nU`J!DhF?|K{=p;u?SRo-eQL~ z3LxPEDv=?DFsK{_I~vKq;4&HPX%3rQaGSvn6voA%N`!@xhlzucgNcWUhmnVgg;9W6 MfQ5yHOOS&H07|vlp8x;= literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4990e39161785df62c53a6081f44e85a040716e6 GIT binary patch literal 1277 zcmZ?b<>g{vU|`Vf?~FOg!octt#DQTB1_lNP1_p-WX$%YuDGVu$ISf${nlXwI%x8*X z0@KV<%qa{hOgSvMtWm6t45_R|E-4Ht%sFhi>{0Bw98ny(oKc*N45edkJ!_pC;oiA>YV=$arTDS7-0|pinM%jRKwWJn8Mh~B+0OVxrS*WV=zM@TR1~SSPjDhmK3Iij46yM%ph48 zhFFJM<{IV{mK0VHKZPxusmQH_bpcxq^Fl@hYXSR0h7=Z%X({XrA-2KHbqi;xVOYRi z!m)reg<~OO!MqZ#1>6f6Kz3?!R&_aNq$X!8Bq}6TmZTOd6qgib=A|p7E|9FvdQpC9LGdj%h#PN-U~}Xx=HklY zTSDonB`K+CiKRIuFxP9c++s;dEJ?h@oRpt?ivuQnizO#BFLfnDksJd9!>>a9f}+f_ z#FA9~vcw|&wEUcu)S_a2BV&DIGc&VtixNxo;=K423!_}i6iZVRW7Bd20|SHf0{syE zg3JQl%)H`~#GD*m3xnM3jBKMEkRTYxXXcfp7Ud=8=$Dpc<`nD0EY~Zjyv3bZT9O|R z@xBBo@d<%aBr6{y7o!xD1fvwA1S20K3uBQ2D8Gx|Vgm(Ja&ZwTN#9~BN-YBExg}MQ zS)d2EMGtI?UP)y^W?p&`C_-+rK{?Ez*a4;WB2Z$##o^@d8y_0tW^s!X$}%*&#RF%? zJGmnBd|ctmjE&$D#zx4>jE&-bT#NV^7#MD`C+FuDWagw634<&JxgQ+JNQ68{8HY`7 jeoARhsvRi36oaCHgAojwc$ioiMVP^ChzKJOGZ!-eO3h)P literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a098de22c07085c84cbde8bed7847fea3294650c GIT binary patch literal 669 zcmZ?b<>g{vU|`Vf?~J*}%)sy%#DQTZ1_lNP1_p*=4F(2=6owSW9EK{ z%R+_}=4_^-xJsT9)*6Op##*LuhCC4#h7z`HuA&e|1`teP31*03s9^%B3}z@{T)7E5@% zzxOTnl+2>M#N1R(<{~x*28LT41x2Z4nfax~w>Us1fx=}aLlGYX1H-Rk{eq&*vc!^9 z{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV%M?pf6JyhI0|Ntt^aA}5{esK_ z-ORk=lEj=GT?>QU?2K%q9FQOw$7kl1q!#5R=IED}Wabp>r)B1(7FQORq~_`sRNfLu z&PYwphQv{Rd0uJ}J1A0QKrzL_#mK_M!pOzQ!^FeP#K^OW!6d*W##kf(N-?ZO ztROG3=NIdN{BldGAhSRZZk-<3I=$rl+=9dsa2SDgf&Gd^@Pmxtu*uC&Da}c>1BH1p MD4;kPIhc5u0RZ2p;Q#;t literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86f2d0fb34c354577009cba89ace4931a26971c8 GIT binary patch literal 1688 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 Nz`@PI!ok781_0;HfSdpT literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245e3bb34d64571e51d2eea5a5bf43389d845ffb GIT binary patch literal 1949 zcmZ?b<>g{vU|`Vf?~D;*VPJR+;=nKq0|SEt0|P^`0s{j>3PTh_3S$aW4r3IfJ3|U{ z3QG$^3QHkXh~*HW=Uphu|isYkwQvpT4r8mUb;eVeoAUiG1p6w zxqitY5{8*zHbgKmFr+d>F{Us?F{LnqOiW>JVTfW$VM$?aVTfW)VM}3eVTfW&;Yi_Z zVTfW+;Y#6dVTj^L;Ys0bVTj^P;Y;CfVTj^N5l9hiVTj^R5lRtmVTj^M5ea6{6ul+l zom%OXSe%;ToS$2eSd{9US&^AnWgAeGUzVAYTC9)^7S1fr%+FIuPAo`Fg88E)Be6sw zvsfVsq*)<9Pa#nuJGGKaK|w(wnHlN}5DoH(GXn!du>b=DLk(jMLp(zbQw>8rV+uns zgC?V&CetmRc!({j@!6@BxA@~>!4sdHlUQ7=$$X2YI5j8j7Bfhe4^?s{LlFl91H-R; z{eq&*vc!^9{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV%M?pf6JyhI0|Ntt z^aA}5{esK_-ORk=lEj=GT?>QU?2K%q9FQOw$7kl1q!#5R=IED}Wabp>L*h%Xpz;<+ ze0*kJW=VWJH^^_G^uWN###kkbEjaaHYLgkE0Ry7p0Ru{AB@8tTS&Yq$upnW{NG#4M z0)?L@V-YI@1H_wPzZP*aFff4Z2Puh<=LgvjGK&GX?GTm8U{wqZ3?LfhVsNzZfueFpjD*`!42+2{>ID!OZ5=l-f;su2R$h}~Pq{1Ci1WH=y&Jbi^U=St78L9E{6gVRt z5gu5b0SXBTBAfv-hZ1KH2n}Hd1_o(joIzP=q!!|j6cGjn200>}0Wybz(8wbY8lZHc zNQ5&$=Aaa2pbQDlH6TxvfQz#%#%88sffA-*aIu!fT*H{f+zib{EVsBai@}9UUUF&? zD9hdA^UE*s%q_@C%}vcKNlk%dab|FS0;iu_Y`Li=8Tl#b$r+UPRX|Q=0~H~RJd7+% zxC$F+Vd|&J3o0e@5_41I<8N`r$LHp!l;(igJn`{`rHMIE8TR=2l>FrQ_##j_RKx?y zW1uWt1j;}~pyXQwN<2lNs4D^m93&fp^E-k7l}SaQa)lk_Mvz(#CKe_R77k`)2v(uV qQX~Vi1d@^Sld@8iOTZFHUIrTsGV>OP4aC`YAj6A6LCC_y!3+T5C!>Y{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bddb3813cffb8adbb71af9aabc63287a5c6da088 GIT binary patch literal 4085 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 QVB}$DVdi2MFy!C|0IXGI+yDRo literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed238f3e447e2d8a31bf3507a7b6236fad162949 GIT binary patch literal 2621 zcmZ?b<>g{vU|`Vf?~HlK#lY|w#DQUE1_lNP1_p-WeGCi?DGVu$ISjdsQH+crHd78$ z6jKUA3R4bq6mtqg3UdxiE^8DkSdJx!Etfrt9n5CU;mGBT;>_iW;sW#8a=3GOqIke; z_8i_^z9>F0nRtuUM1u7EelMaY0UEWqd(mNrool zEg|2?fXH}f4_9aJ_@GcfKTkh*O~zXs{$LG>Ihu^O*nLxrixbmRL7H7Mi%W_!lS)CR zB{PDY%D}(?3V%)p1_ozP9M~~1Fw`)lFlKWU@qm0(!mxm`hG8LNEn^AO0_GIv1uP}3 zC2S?^SsW>hDJ-o_k_^pE3mF$O)-u&F)i7qW1v6-}Cb}~+FmNd-C@45*q$X!8WTq*U zWTYw-RF-7q=P5varjVJZP+FX-kegVNoB@_kC`v6X%`8eSj)$mBP=E)B9v9fSpwyDm zqP${-gpi`r)C8EhFaz_`U{)X-omvbw9BOuMYF>#Rs#$J{ImJX6mXe=ZtdN&q0&y_J zRIouPCWA$S5;Kcaixm>{6g>0F5_2+Bf?*L0ax$hjGZM>EL8>z$suj}mi*gg8&h!hp z#i;iZ6h)exMXU@A47YgTrUj>#6tRJXSPMXj>K02@erDb+=G?@BTg=5JMYouXD~oUO zK!YbfGcPS)llc}u)V;7!z9oq!5DyRaTYQj+h=&@nlA%bFfq~&yk$yo@W?5oMs(x8w zk$zf!PD*M~vA&V9zOk8^S-C}trFn5)e2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fo^7A zaY!&N>YpR5_9xROEPnc^$QY{vlG)Z^V0PSDsPD~FcwKOFfgE`ZBVFz({>sI149Wz4MPcI7E?1*kx~uA0_GIP zg^XYp3y4+An5P34Wm?EsWKqMgfF*?ql=kz)N>~@Lr7)MU*Dz#pG&3$_Vq{2RsbwtT zY-RwZ`~_S!j0+hV8ETjoa4%#4Dgw%`o_T5cAR3l!Z}DU#7RSR3 zxy6&7T7uxQ<>aTQrxx8}FHbDW%gjqJ;sBY$k&~aC2+HzBpmcPLB`q~IKSh)TICsQ&3ke zR#!+WErFCErFozrg~??WE2tJ1@q$8ykAZ=q$~*v^TvHWPixn~w!MPunpV6#RNX;uL zssyRiRZuO~UL}*@dX#uF_NKJvbCJa&|+~O%H%FjwoE{V@e z%uOv41UWzmL@wbe@g(p04h=f$ti=XVwNIxkVU+pY6w&|#HVB?mlTPC z#28Z{aSqDuMWBekB?ZZTprnGH2W>#CQ!~Q6bokn)k~Vp zez!P1{enXreSBPliey1PVlGkuxn2l4OT_17=A{4?K7H$SB`C)Ezr_$US?Mjj>( fQ0Ox8FbXj7F!C_+FtLD0MjmD^W)4vf0S;jRsmaw3 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6e4087768b46bd543e07b691792b0c5563167c GIT binary patch literal 395 zcmZ?b<>g{vU|`Vf?~D;+WMFs<;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCR5e&%-n+f zq7sGT)RNMIlKlLfVjYE&{Or`c%&JuD`1rKUoYeSuTh$`#G~4vllEjjdA`O_dj)HoA zL2915jsl3%)PSkhv`)@XNwrPWD@sjF(a_W@N-fAqOitBMk12`)saB84Q`fXk(@W0D zFHY6av`(!^P1Z=x&n?KzN!0*p)lq;MrK6w@l2zB#^wVU##UJb%5*iTV@9z^FAMD}j zyON=ZiGcw^{HoM1D9S8LEJ@WbODxh)%g;$kEh^SGGS)XXGczlerZW& iPO&~BoZ^#8Gjme(3My}L*yQG?l;)(`F@pja6ygAvo_Dwa literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b908db6806888fa98c5ade5d905d85140aebcf9 GIT binary patch literal 4922 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 TY#<54P8w7uGBGePurL7toO#26 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11244e338c5c8f06c4bd871e83f73b7bbe1ccc7e GIT binary patch literal 12306 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 G0a*Zydfg}h literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..9af9fa7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,270 @@ +""" +This code was taken from https://github.com/ActiveState/appdirs and modified +to suit our purposes. +""" +from __future__ import absolute_import + +import os +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + List, Union + ) + + +def user_cache_dir(appname): + # type: (str) -> str + r""" + Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + + Typical user cache directories are: + macOS: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Windows: 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`). 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. + """ + if WINDOWS: + # Get the base path + 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 PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str + 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. + "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: + macOS: ~/Library/Application Support/ + if it exists, else ~/.config/ + 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 WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) if os.path.isdir(os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + ) else os.path.join( + expanduser('~/.config/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + """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. + "roaming" (boolean, default True) can be set False to not 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: + macOS: same as user_data_dir + Unix: ~/.config/ + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see +def site_config_dirs(appname): + # type: (str) -> List[str] + r"""Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support// + Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + # type: (str) -> str + """ + 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. + """ + 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" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + # type: (str) -> str + 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 + + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + 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 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..2d8b3bf --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,264 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Text # noqa: F401 + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None + + +if sys.version_info >= (3, 5): + backslashreplace_decode = "backslashreplace" +else: + # In version 3.4 and older, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + if sys.version_info[0] == 2: + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + + We assume the data is in the locale preferred encoding. + If it won't decode properly, we warn the user but decode as + best we can. + + We also ensure that the output can be safely written to + standard output without encoding errors. + """ + + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + # type: (str, bool) -> str + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # type: (str, bool) -> str + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +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( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +if sys.version_info >= (3, 4): + from importlib.machinery import EXTENSION_SUFFIXES + + def get_extension_suffixes(): + return EXTENSION_SUFFIXES +else: + from imp import get_suffixes + + def get_extension_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# 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')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..0beaf74 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,90 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=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 purposely eagerly formatted as we want it to appear as if someone + # typed this entire message out. + message = "DEPRECATION: " + reason + if replacement is not None: + message += " A possible replacement is {}.".format(replacement) + if issue is not None: + url = "https://github.com/pypa/pip/issues/" + str(issue) + message += " You can find discussion regarding this at {}.".format(url) + + # 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..d36defa --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,39 @@ +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text # noqa: F401 + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """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): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e6b033 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,30 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +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 not hasattr(os, "geteuid"): + return True + + 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 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..8a51f69 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple # noqa: F401 + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + + # 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 + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # type: (str, int, int) -> bool + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + # type: (int, int) -> bool + version_str = glibc_version_string() # type: Optional[str] + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..c6df7a1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash # noqa: F401 + else: + from hashlib import _hash as _Hash # noqa: F401 + + +# 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(object): + """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 + """ + self._allowed = {} if hashes is None else hashes + + 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 iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + 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__() + + +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(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..579d696 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,318 @@ +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +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() +_log_state.indentation = 0 + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, 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 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + def __init__(self, *args, **kwargs): + """ + A logging.Formatter obeying containing indent_log contexts. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + prefix = '' + if self.add_timestamp: + prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + 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): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # 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): + msg = logging.StreamHandler.format(self, 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): + 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 self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +def setup_logging(verbosity, no_color, user_log_file): + """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", + } + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "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_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "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": ["console", "console_errors"] + ( + ["user_log"] if include_user_log else [] + ), + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..84605ee --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,1040 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +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 ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """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.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # 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: (Union[str, Text]) -> 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 sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + 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 ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def is_svn_page(html): + # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + # type: (str) -> Text + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + 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[Union[str, Text]]) -> 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 normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + 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." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(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. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.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 normalize_path( + 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, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + # because of pkg_resources vendoring, mypy cannot find stub in typeshed + return [d for d in pkg_resources.working_set # type: ignore + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +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(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if 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. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +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 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() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + 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: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + 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)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type, # type: Optional[str] + link # type: Optional[Link] +): + # 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) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip._internal.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(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( + 'Cannot determine archive format of %s' % location + ) + + +def call_subprocess( + cmd, # type: List[str] + 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]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None # type: Optional[SpinnerInterface] +): + # type: (...) -> Optional[Text] + """ + Args: + 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(). + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("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( + cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=stdout, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + if stdout is not None: + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode and proc.returncode not in extra_ok_returncodes: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + if not show_stdout: + return ''.join(all_output) + return None + + +def read_text_file(filename): + # type: (str) -> str + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + # https://github.com/python/mypy/issues/1174 + data = data.decode(enc) # type: ignore + except UnicodeDecodeError: + continue + break + + assert not isinstance(data, bytes) # Latin1 should have worked. + return data + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """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(): + """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(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + 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 make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + """ + 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 = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def split_auth_from_netloc(netloc): + """ + 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) + 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_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the password in a netloc with "****", if it exists. + + For example, "user:pass@example.com" returns "user:****@example.com". + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + password = '' if password is None else ':****' + return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + purl = urllib_parse.urlsplit(url) + netloc = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc)[0] + + +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) + + +def redact_password_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, redact_netloc) + + +def protect_pip_from_modification_on_windows(modifying_pip): + """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)) + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""Utilities for defining models +""" + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparision capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..37c47a4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,164 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile, pkg_resources +from pip._vendor.packaging import version as packaging_version + +from pip._internal.index import PackageFinder +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse # noqa: F401 + from typing import Any, Dict # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + 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.json") + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + 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)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +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. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return (dist.has_metadata('INSTALLER') and + 'pip' in dist.get_metadata_lines('INSTALLER')) + except pkg_resources.DistributionNotFound: + return False + + +def pip_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_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_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 + finder = PackageFinder( + find_links=options.find_links, + index_urls=[options.index_url] + options.extra_index_urls, + allow_all_prereleases=False, # Explicitly set to False + trusted_hosts=options.trusted_hosts, + session=session, + ) + all_candidates = finder.find_all_candidates("pip") + if not all_candidates: + return + pypi_version = str( + max(all_candidates, key=lambda c: c.version).version + ) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip')): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..7aaf7b5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions +from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from email.message import Message # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + # type: (Optional[str]) -> bool + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + metadata = dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + feed_parser = FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + +def check_dist_requires_python(dist): + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s", + dist.project_name, requires_python, e, + ) + return + + +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/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..2c81ad5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +import errno +import itertools +import logging +import os.path +import tempfile + +from pip._internal.utils.misc import rmtree + +logger = logging.getLogger(__name__) + + +class TempDirectory(object): + """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 or None + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + create() + Creates a temporary directory and stores its path in the path + attribute. + cleanup() + Deletes the temporary directory and sets path attribute to None + + When used as a context manager, a temporary directory is created on + entering the context and, if the delete attribute is True, on exiting the + context the created directory is deleted. + """ + + def __init__(self, path=None, delete=None, kind="temp"): + super(TempDirectory, self).__init__() + + if path is None and delete is None: + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + delete = True + + self.path = path + self.delete = delete + self.kind = kind + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + self.create() + return self + + def __exit__(self, exc, value, tb): + if self.delete: + self.cleanup() + + def create(self): + """Create a temporary directory and store its path in self.path + """ + if self.path is not None: + logger.debug( + "Skipped creation of temporary directory: {}".format(self.path) + ) + return + # 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. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) + + def cleanup(self): + """Remove the temporary directory created and reset state + """ + if self.path is not None and os.path.exists(self.path): + rmtree(self.path) + self.path = None + + +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): + super(AdjacentTempDirectory, self).__init__(delete=delete) + self.original = original.rstrip('/\\') + + @classmethod + def _generate_names(cls, name): + """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): + 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: + self.path = os.path.realpath(path) + break + + if not self.path: + # Final fallback on the default behavior. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..e085cdf --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... # noqa: F401 + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 0000000..433675d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,441 @@ +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress.bar import ( + Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, + ShadyBar, +) +from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +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 +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Iterator, IO # noqa: F401 + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + 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", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + 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: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + 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): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + 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): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + 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): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # 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 neds 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: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # 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) + # 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" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore + ChargingBar): + pass + + +class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore + pass + + +class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore + FillingSquaresBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + 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": (DownloadIncrementalBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # type: (IO) -> 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) + + +class RateLimiter(object): + 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() + + +class SpinnerInterface(object): + 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): + 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): + 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): + 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("finished with status '%s'" % (final_status,)) + self._finished = True + + +@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") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..9cba764 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,534 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + 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, vcs, rev=None, extra_args=None): + # type: (VersionControl, Optional[str], Optional[List[str]]) -> None + """ + Args: + vcs: a VersionControl object. + 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.vcs = vcs + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> List[str] + """ + Return the VCS-specific command arguments. + """ + args = [] # type: List[str] + rev = self.arg_rev + if rev is not None: + args += self.vcs.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(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.vcs.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Type[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) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[Type[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, cls=None, name=None): + # type: (Optional[Type[VersionControl]], Optional[str]) -> None + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_type(self, location): + # type: (str) -> Optional[Type[VersionControl]] + """ + Return the type of the version control backend if found at given + location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type + return None + + def get_backend(self, name): + # type: (str) -> Optional[Type[VersionControl]] + name = name.lower() + if name in self._registry: + return self._registry[name] + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + 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] + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def get_base_rev_args(self, rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def make_rev_options(self, rev=None, extra_args=None): + # type: (Optional[str], Optional[List[str]]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(self, 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) + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + def get_netloc_and_auth(self, netloc, scheme): + """ + 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) + + def get_url_rev_and_auth(self, 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 <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + def make_rev_args(self, username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (str) -> Tuple[str, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + url, rev, user_pass = self.get_url_rev_and_auth(url) + username, password = user_pass + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return url, rev_options + + def normalize_url(self, url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + """ + 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): + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def is_commit_id_equal(self, dest, name): + """ + 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): + # type: (str) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + Args: + dest: the repository directory in which to install or update. + """ + url, rev_options = self.get_url_rev_options(self.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): + 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? %s' % 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): + # type: (str) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + @classmethod + def get_src_requirement(cls, location, project_name): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + @classmethod + def get_remote_url(cls, location): + """ + 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): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: List[str] + 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] + ): + # type: (...) -> Optional[Text] + """ + 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 = [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) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @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 controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + 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. + """ + return cls.is_repository_directory(location) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32b9266d803cd0846a59650f5acb23a759f3c5fa GIT binary patch literal 15391 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 ATL1t6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6db2cd4a3eaa8d87c4f701fd01c5b5c1dcddc499 GIT binary patch literal 3808 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 bWHG2f;$h+dwWgSO7)6+Q7zLQPm<195yjZfm literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3d5f55483564066a529edb28795a8b0a34b0aaa GIT binary patch literal 9450 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 T4Kz^5%*D*XB2dpz&kzIvdH#ed literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbe8cdbe51f05dd08af3cce0e68772f56c7f4cbb GIT binary patch literal 3781 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a34f52d6e45ba00537901c1905054d0ba4524c4 GIT binary patch literal 5993 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..4c6ac79 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,114 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['export', location], + cwd=temp_dir.path, show_stdout=False, + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, url, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, self).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): + urls = cls.run_command(['info'], show_stdout=False, 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 + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + current_rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, current_rev, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..dd2bd61 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,369 @@ +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, redact_password_from_url, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import RemoteNotFoundError, VersionControl, 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): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', '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' + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + 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('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + def get_base_rev_args(self, rev): + return [rev] + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version becasue + # 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) + + def get_current_branch(self, location): + """ + 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 = self.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location): + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + def get_revision_sha(self, dest, rev): + """ + 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 = self.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + def resolve_revision(self, dest, url, rev_options): + """ + 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 + sha, is_branch = self.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 rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = self.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + def is_commit_id_equal(self, dest, name): + """ + 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 self.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', redact_password_from_url(url), + rev_display, display_path(dest), + ) + self.run_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 = ['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 = 'origin/{}'.format(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): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # 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 = ['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): + """ + 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, 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 get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def _get_subdirectory(cls, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = cls.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # 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 + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + current_rev = cls.get_revision(location) + subdir = cls._get_subdirectory(location) + req = make_vcs_requirement_url(repo, current_rev, project_name, + subdir=subdir) + + return req + + def get_url_rev_and_auth(self, url): + """ + 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. + """ + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + + return url, rev, user_pass + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls.run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..26e75de --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, make_vcs_requirement_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + def get_base_rev_args(self, rev): + return [rev] + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + 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 = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_revision_hash(cls, location): + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + current_rev_hash = cls.get_revision_hash(location) + return make_vcs_requirement_url(repo, current_rev_hash, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..42ac5ac --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,200 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, +) +from pip._internal.vcs import VersionControl, vcs + +_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'<url>(.*)</url>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(self.url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = ['export'] + rev_options.to_args() + [url, location] + self.run_command(cmd_args, show_stdout=False) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files 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: + 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 revision + + def get_netloc_and_auth(self, netloc, scheme): + """ + 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(Subversion, self).get_netloc_and_auth( + netloc, scheme) + + return split_auth_from_netloc(netloc) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + def make_rev_args(self, username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # 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, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + 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 = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = cls.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).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 get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if repo is None: + return None + repo = 'svn+' + repo + rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, rev, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_internal/wheel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/wheel.py new file mode 100644 index 0000000..67bcc7f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_internal/wheel.py @@ -0,0 +1,1095 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +import csv +import hashlib +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six import StringIO + +from pip._internal import pep425tags +from pip._internal.download import path_to_url, unpack_url +from pip._internal.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel, +) +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, distutils_scheme, +) +from pip._internal.models.link import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, captured_stdout, ensure_dir, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, + Union, Iterable + ) + from pip._vendor.packaging.requirements import Requirement # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.index import FormatControl, PackageFinder # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.pep425tags import Pep425Tag # noqa: F401 + + InstalledCSVRow = Tuple[str, ...] + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """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) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def replace_python_tag(wheelname, new_tag): + # type: (str, str) -> str + """Replace the Python tag in a wheel file name with a new value. + """ + parts = wheelname.split('-') + parts[-3] = new_tag + return '-'.join(parts) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if 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 + return None + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + # type: (str, str) -> bool + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + """get the string representation of EntryPoint, remove space and split + on '='""" + return str(s).replace(" ", "").split("=") + + # 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] + 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 + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, scripts in warn_for.items(): + scripts = sorted(scripts) + if len(scripts) == 1: + start_text = "script {} is".format(scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(scripts[:-1]) + " and " + 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")) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """ + Return the given rows of a RECORD file in sorted order. + + 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(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: set + 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: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +def move_wheel_files( + name, # type: str + req, # type: Requirement + wheeldir, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + pycompile=True, # type: bool + scheme=None, # type: Optional[Mapping[str, str]] + isolated=False, # type: bool + prefix=None, # type: Optional[str] + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel""" + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] # type: List[str] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # 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[str, str] + changed = set() + generated = [] # type: List[str] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes 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(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + 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) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(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 + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + # ignore type, because mypy disallows assigning to a method, + # see https://github.com/python/mypy/issues/2427 + maker._get_script_text = _get_script_text # type: ignore + maker.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()) +""" + + # 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: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # 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: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # 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 and GUI entry points specified in the wheel + if len(console) > 0: + generated_console_scripts = maker.make_multiple( + ['%s = %s' % kv for kv in console.items()] + ) + generated.extend(generated_console_scripts) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + # type: (Optional[str]) -> Optional[Tuple[int, ...]] + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return None if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except Exception: + return None + + +def check_compatibility(version, name): + # type: (Optional[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 not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: Maybe move the class into the models sub-package + # TODO: Maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) + ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.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( + "%s is not a valid wheel filename." % 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 = { + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def support_index_min(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> Optional[int] + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.get_supported() + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> bool + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.get_supported() + return bool(set(tags).intersection(self.file_tags)) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """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_use_ephemeral_cache( + req, # type: InstallRequirement + format_control, # type: FormatControl + autobuilding, # type: bool + cache_available # type: bool +): + # type: (...) -> Optional[bool] + """ + Return whether to build an InstallRequirement object using the + ephemeral cache. + + :param cache_available: whether a cache directory is available for the + autobuilding=True case. + + :return: True or False to build the requirement with ephem_cache=True + or False, respectively; or None not to build the requirement. + """ + if req.constraint: + return None + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return None + if not autobuilding: + return False + + if req.editable or not req.source_dir: + return None + + if req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + return True + + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + return None + + link = req.link + base, ext = link.splitext() + if cache_available and _contains_egg_info(base): + return False + + # Otherwise, build the wheel just for this run using the ephemeral + # cache since we are either in the case of e.g. a local directory, or + # no cache directory is available to use. + return True + + +def format_command( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + text = 'Command arguments: {}\n'.format(command_args) + + 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 += ( + 'Command output:\n{}' + '-----------------------------------------' + ).format(command_output) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + req, # type: InstallRequirement + 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(req.name) + msg += format_command(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(req.name, names) + msg += format_command(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__( + self, + finder, # type: PackageFinder + preparer, # type: RequirementPreparer + wheel_cache, # type: WheelCache + build_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + no_clean=False # type: bool + ): + # type: (...) -> None + self.finder = finder + self.preparer = preparer + self.wheel_cache = wheel_cache + + self._wheel_dir = preparer.wheel_download_dir + + self.build_options = build_options or [] + self.global_options = global_options or [] + self.no_clean = no_clean + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return self._build_one_inside_env(req, output_dir, + python_tag=python_tag) + + def _build_one_inside_env(self, req, output_dir, python_tag=None): + with TempDirectory(kind="wheel") as temp_dir: + if req.use_pep517: + builder = self._build_one_pep517 + else: + builder = self._build_one_legacy + wheel_path = builder(req, temp_dir.path, python_tag=python_tag) + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + shutil.move(wheel_path, dest_path) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + + def _base_setup_args(self, req): + # 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. + return [ + sys.executable, '-u', '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def _build_one_pep517(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert req.metadata_directory is not None + try: + req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) + logger.debug('Destination directory: %s', tempd) + wheel_name = req.pep517_backend.build_wheel( + tempd, + metadata_directory=req.metadata_directory + ) + if python_tag: + # General PEP 517 backends don't necessarily support + # a "--python-tag" option, so we rename the wheel + # file directly. + new_name = replace_python_tag(wheel_name, python_tag) + os.rename( + os.path.join(tempd, wheel_name), + os.path.join(tempd, new_name) + ) + # Reassign to simplify the return at the end of function + wheel_name = new_name + except Exception: + logger.error('Failed building wheel for %s', req.name) + return None + return os.path.join(tempd, wheel_name) + + def _build_one_legacy(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + base_args = self._base_setup_args(req) + + spin_message = 'Building wheel for %s (setup.py)' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + output = call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return None + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + req=req, + command_args=wheel_args, + command_output=output, + ) + return wheel_path + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build( + self, + requirements, # type: Iterable[InstallRequirement] + session, # type: PipSession + autobuilding=False # type: bool + ): + # type: (...) -> List[InstallRequirement] + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + buildset = [] + format_control = self.finder.format_control + # Whether a cache directory is available for autobuilding=True. + cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) + + for req in requirements: + ephem_cache = should_use_ephemeral_cache( + req, format_control=format_control, autobuilding=autobuilding, + cache_available=cache_available, + ) + if ephem_cache is None: + continue + + buildset.append((req, ephem_cache)) + + if not buildset: + return [] + + # Is any wheel build not using the ephemeral cache? + if any(not ephem_cache for _, ephem_cache in buildset): + have_directory_for_build = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert have_directory_for_build + + # TODO by @pradyunsg + # Should break up this method into 2 separate methods. + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for (req, _) in buildset]), + ) + _cache = self.wheel_cache # shorter name + with indent_log(): + build_success, build_failure = [], [] + for req, ephem in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + if ephem: + output_dir = _cache.get_ephem_path_for_link(req.link) + else: + output_dir = _cache.get_path_for_link(req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.preparer.build_dir + ) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=session, + ) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return a list of requirements that failed to build + return build_failure diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..b919b54 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,111 @@ +""" +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__(vendored_name, globals(), locals(), level=0) + except ImportError: + 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("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + 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("pytoml") + vendored("retrying") + vendored("requests") + 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("urllib3") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a482d6acc684bc296e3840a80548516b27becf43 GIT binary patch literal 2888 zcmZ?b<>g{vU|`Vf?~GY3#K7<v#DQTp1_lNP1_p-WcZ>`SDGX5zDU2yhIgGhXQA~^= zHggVh6mtq=3Udxi6f2l!i(*S*iDFM>&Ei<V2`0Hxxfe1nWQ^iTVNGFcVTj^QWuL%U z^eUBk0W(;hFO?^SeIe6A##FW}4siw$nZlgH+{$Fbkjk6F(agvQqB)^77nJ6P(mYU_ z7fSO%X?`dz0Hp<?v=EdQhSDNXS`<o)L1}R)Ediw^p|li~mWI+YP+AsB%Ry;*D6Igc z6``~elvak)Do|P#N~=L>bttU?r8S|n7L?Y8(mGID7fS0vX?-Yd0HqC~v=NjxhSDZb z+7wEgf#?+GU<OU|sykc-nFV_BWvO{7`9%tu#R_TpMG6pJW?s5NN@_uBUP@|Sa%O6= zLVlV;L1uwMNxnisQEFLgUWr0pYHA8d8AO;1qFNz8PoX$JH?<@KB$ZlGl3J9Pn4`zV z<(8R~TC9+nSDcxW3N;LFb8$v~X-<klQmR67K3G9fYKlT;Zf<EwVp2}3LSkNu0#r$U zUQVS#QYu$zK}uptY6{3XWvNBQnfZCe3TZ|8xeBEP#U(|liMe`QFF|QslkpaRVp4H_ zPH9PMd}eMzeo={^TQVa^ih+TFg@J*An}LDB8I%K-FfcHrFfL#yVXR?T$W+T%DN({y z!&t)H%uvG8%#gyA!raTk$PmtuSH;3m!kW!hG>?%11i|VUu&5J(s!IT=Vq}P9$g_%I zC}GQDuVIjc(2O<=HH-^5Qdm-07c#{#)iTvGmvDkrFiA4hFoRhPk_^qvVBJg+3@Hr3 z44Q0yRqWLUwR+WtwM8JGXfobn%}Fgw&AG*>_Yy3?b&D-6zbH4c<Q7MKd|qO1YJB`H zu6U^b<Ku6!r|0A+CFT_0V#~=-2GQJ};Gl6WD#|aq#avuje2YCdKczG$wfGiWQE@>| zX2~t~;?$DFl9D1#mRnp9Igr7(cp=FpH3e+XEtaIj;?!F#8L5dWD;bJJ7#J9SW$G6c zWtJtDr0SO?7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~I zhv*k%7U*W?6_+ID<mg%$<Ys4N8|8om!5Erq_2c6+^D;}~<Mj$EZ*jmJBMXX9F;FZs z@-Q(mN-**<f=Ny`CILnP#v+hZ6|0tBc}C7Hp5(;jjMU`(ypp2)oLd~p`8oMTiMffl z*i$l#OL8)kZn1$FMftZlGD>oDOhF<XIr+)iX_+~xx0s7FE2=n)Gb{9R^UG3;s|4Uo zz0#tboXn&uF?12Vg2bZY)LWbdiOJcC>6v-yRf2G)9yBpmi6DfE3sRFa(=t<wif^$M zq!ySOn&09r$WD(hN-fSWElN%;zQs{cl%HOdS`1Q9S(2ZdbBm)WwWO#rGcO&)DlAPc zE-9`OEJ}s2^dM%Z7FS7P2ti$KT&0FnN-sV+KPM+OxdfEys#I{ROU}>BgD9)gAVyU| zetu4sB3_jxMVU!eS_GBo<(1^*f{oKAthS&szaTZQxHt!&Us5ZQQwtzIR={m!T4ria zN^zAEJ{38s1^LA#_|(9oM<2I2Fg1GlMJcI8sVVU(naL&iA`PwqlweJXFu1rlCq6f^ zBsn8KBfq!=l-H|V$<n3=DtB^Hb5rw55<wwYrHaRx{QR8U#Jt4x)FON-0crrgKrBiv zF38U-POXxIDlUd6dsrIRD=o>)snWzRuZNV1@#G1RQF>65s??zj99HVV-G(RgKn*M@ zs;p8bU>qo>@I^h?sFKXw)cjJs=?<)}v?%8mJEZ6`*5tp%9v`2QpA4x!(n?E8i&Ep` zi<lS~7;dqE>X2LP`5;f0WZYuPFD~K%iF3NRI)(bV__(^<Vkt;0$+*Rym{bg5q+}L> z(h;aq0u`R|@wYg`JzQOV;$1w0z(w*cmaP2DJaDyvM2Lcn<*<QNI(F=!qP+lAc{B1b eaWHZ)a<H<niLi0VvN5YLgZUsaN-)G!3=;r>h=vaU literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95fa2df1879314797407ade008736083bf421f83 GIT binary patch literal 20617 zcmZ?b<>g{vU|`Vf?~HjI&%p2)#DQUM1_lNP1_p-W0wxBA6ox2<6vimV6s84Csm!S? zsf^7`3mKzWQ<zg&a@eBSz%+Xldn#KNM+&nfLkep)Qxs<^XOUehOB7csTNd{Mo)or) zj71$_mE2L>soV>A7c!)<N-}`dNAacdE#OIEU&vTgl)@3kU)Trcb1q~oYD(b(@l&{? z`19C6CPne5n56Kg@U<{T38a{&@TUm0Fh&Wcn577&2(>Uq38k2)2&ag&Fh&WdSfq%h zh_^6CiKJMjNTf)%Fh+@{Sfxm%NVhOXiMcbR$fU@&Fr>()iZ?SyNu<c7$hR;=Nv0^I zD7G*}Nu?;ID7P>~NvEi!sJ1Xf$)xh9aAY%0U@S_j6iH!DQOl9dm5Y*NWJr~ck`HId zb7EmgRmkR=z*v;R$N++s0${%?Mk%GrfK^DrRm6eh85vR~qvRtQ@|YqRAY`g?ih4HF z1g4^#6pbjA6wN5r6s;(=RP_|?R8}#DW=2MaRP_`cFfEa)lB$}bo1)jt9HmjAlB(vy z5Gxa<nW~<mpQ@Rvm8y}d+02y21kp8tv2aN^NUs4xZ!;57`tE@B8N&26GZLYTsZa>4 z%Lt|`g(t<hml*q)3Vp&EQdoi+G_9*DLrXGqGD|X3ixtxHixg5)OHzw+GxIX@(iIX5 z3UV@&6H7Al^K^>~Qj;^&GLscjGK-4!xVVB-Qx$A7N=gc>^!3v-OEOB6^pf*)^&OK- zGRsnfOA<>`^%DyUK#J{P<|bz56e}d=r6`mZC#I+BacMHYWMp7qc*z1Hm>C!tZZYb; z1Z4}qA~267E3qu`7JGPRUP^v>@h#T!%sgYGC}!Wp<XdbhiACj^c~NXRnR%rZMsCR< zGeBC|7#J8p*cp_gjxjJWlrW?)W-}GV)i9<oWpfmX)G*XC)-V^zq%arArLfeplrUy7 zEnqHTsbOhmT*z3<TEkGZriL+vHJh`@4=l%8!&<{w!?2LKmbGvVT!djEQ!Q(rUkO7B zTQ*Zs8(5qTl&>HrfcYSu5Or!Lj0@OPIKZN8DVz%#LApUUfkoizY8Z+R)i4zuf{QYN z)v*RMXmTZbu`@6PrIwTy<te0<=Hw_8B$i|-l;kUvWTYyT7N-^=#ZY2NA}E@`;a-xF zS&ST!dR$xzP@t4pP>`3Ho2sOcSqwG?#8JpkLsbq{45mEO6#Vk@QgsxvN{dUtT8b-+ zOHy+|wxuSQ<QG+fj4A@VGBrgH#iqp4l8pQ!B?XQAyqrpqi>x^Aw<ws|nHv@(Iid zB^jx3-5{$I3ko0xD1g#vW^qYTW>RShD3K=Rr&MD1sX|C)L1uDdPEI9?QJEz$%ks;? z$vinfw;(aEQUPSQo<ayHz|s<Pa*7p_5|gt*K@1HiJ%z~pQia?^RO1Q~i;ET95_5`E zK}u6HixZP_QWY{wkbGa3T2!2wp9c=-#5{%k0#J@h%u#@fL!vS@Cp9-UuLNXBVnIP_ zUJ8hX9t@yJhdLuOJ)=aSJQ1R!6l6Qd;hAX)mHDL*@!Zm!lFWjfRG2-*D8Y~qR#^m! zY>-V!sS03+m*guHmF6jA=B1>99Fdw=l2fUt;F$)FF&za^azZhtJijz2MWF;1(h5nb z3Q9J)iCOtYc6v6snR)p|c1nn#07a!gDE`4kOKOTjc}8j;$O)jZ2SrOkQEG8&9&+Fn z<tOH5=A|nsXe8z5=cFd)=_sV6rX`l<lt4mVQz1Dq4`gj|YKcNfQ7JeYAmNb;OI|20 zh8hU6H3gbeAZb@mAtWQQL?JgdF%Og<5=+3z3Y52sK}j_ct7&<uCFS`=*$Ty}C8Y&m z4KVWyit^Jkb5e^Tfd&e{A_cI8<(WA-3Q4HxySOqhSsk1sa`MwN^Yj#gQ&APb%G#3D z<cz%36208a<f8oI{In8qv74HwTUxB2lbKYMSX8N>oNR7pW@2Hf5gx2(XrQT=SX@wH zhY|*$k{(n>6epJ!gOVmF*Jl<Nm!^V>c2FcivksE0Q!<Od!33%(5{pu;;O6-zCM);{ zD@0g<^daFoeIKZM91-=1LU3t8L4Hw*zKvr+fnQ>7D#Bf%d6^aHW`K;V)7Q(%PfpCy zFV09TN=0Y{$ti=1gUmbyl?WI2co)YI$9NBaUsoN4%rsCU$;?YlfjcuiGfyERKtUrf zzeE8VMVcV%oULM9@{>zJc@I)M1*evP3YOv+8&K4P5~f`YvJYGmOA=#1&UXZtXm(&W zs#jokA=?9TE>U**fIO=JcLf<%n=4@TW@vG05xTFyo&nnk_6B}0fy~9?C7k94L9#9m zlfg0LmS3a*ig+D`@>GSi{G6Qpa&Wy8;o`0UYI1<v3&oH$gBHt>QU#G^brg~+L9q@l z8kBIQ8falu#KFM8;CGAHIoQ+1C*Cn20F-!c2}8I({?3kYLAN4K1_p*IIsD1_7B5N) ztl~qpUz6h&8>Fhd#gt!siv?7U-{Q#2FUke8_~X-4OXABj^WxL;b5c@^Zn0$LXXf4F zO06hJ%u4|!!&_|WsU@j-Wtwca*rC<YElzl)c#9ocmE2;7#?LL*<ovwik|KTv28NXk zMN$k548Jn;3yLz!KrOSf#3Fr&O~v{~#`?x)W@hCUC6?yJdGRS0M!A+LmZm1grsW0( z1_tQ``XTxSnFYF;dBr7(IXSu(2D#Z8*+w}aK`@RlOU+BkFVcrL_w))XZ}Ebh91kk& z;!`q<bU|$~HBjqJfrF8Qk%f_mQGk(!k%Li)Nq~`qk%y6mQGiK=k%f_uk%N(su}Fr2 zfdQpK$IigO0BR8y^Dx32bV0BNT?a!gBe=oDT*8vV3~t1+bTAaXt6@xG$>uC_0?V=1 zu+%VifEsZuh3{Y@9iYY;OWvFka5t)`3M|eB>OR$iO#t&*YgnM_O2Cac_7cV{js>hK z94VaXOyGtbOA1#CcMC%e%K}c2+(JedhGxcE)((cE3pGqd`yi%tFw`(DWa?ySXGmjA z;Ys0c;izGSsH<TvdIZw9fVGBoA!98|9!Cvp3a=zXElUkcFhd8!1jZtc8c=r#(tHH@ z1k@}9%WCo^X0j1#7J^F66iCgJl3AnxD*8dSIH>-EweCk7g`<r^Q2hjI22|#k7J<^n zpl%dGnzo5085nKqg2bZ4Tu>iY0o>03w=<JrEnBU;%nER|1NN+ff<k#lW^x9ou?y<v zrb1hNpngbdUP)$AszOd?aS13;Kt&m-lT)lvoB?j|qBY;(T^<D|cpU_4_oXVNWfm2e zC}e^<Nohs-xeD-V!o@QvSRoU&O%5|g2h^-l*DozD(#P8LQP)B7MP?d?u?nDOPH}1p zq_+oa%@t>sq{2%A!mT+98gRJX4)PjU7Ogo4_YtJ=1ZtWoDBx}|Ip*XjKpGw-Hju(H zi%SwArYmT;C1&O*DkwQy#RL@PrxzvWg4#onG^LP{nUa#4r=SI?x3xgg4-T?QP-g&a zik>Elqs^hFqMC-i^`oGmpse5lwn0ZBskB6)yeP9I6`W2Xy<!D(XrYW~A%RQn%wmPo zVo<*qlu8lJUQlX^Hi(6_f1rB99fSNl{oJh-T=KyQq7>FmgxCQZRsr`kz)dc&mvliP z0#Xa=4(6AE+GIrv<r$Tb#ul{IBm!wBIs5zi`uo8ePtbOf48BBz)Jg(5xJm$=5Rj61 z6&F|poHUXdK}`k*1_mYu1_n?QAQ;q+P+(wSNN1>Fh?S^iEMdrET)<SrxPZBYA&X@p z<3h%XOoc4LkmimiYY`s<0|U4PR3r=<U1BQ&4I32PVlGZC&}6#Bq-Su8u>#yQf)LW6 zMiQ3|D9?k21nj1Q>;qZO#!#gQ$~y2Cjh+qI&Bb<l2-PUg1r0%g>?{VgWx&oAK{&UA z0n~Cpb}BQ(sUW`<34sQRnTixaZdU@a8H+?gY)})f2;{^fWd;U@nFzNPv4T`_74d>p zA-pUA;tGNYkcr?BC=vk$13Re6S)5vMi?z5QC$mJ84Pw3+NU1nT0Vlk41qa?O4v+>= zsDOh>6Y3t2Q*QC11WO9YQ6`{RlZQ0)Fq(NRY>YyTVvH={#-0!p3nL#B2O|p;52)Fv zf!yo^`3V$=;BmYN*f<_rkwgh&4Fjm@SHs-QQp=L3R>HJ^Ifc1|DT`$RYYHe0Fx9fu zFcjH=Mc8UsYQT-W8it~f8m6KUxG16t#hQ49l~5B3HujmEpO==I4k`&on^CY4A9xW6 zs#8asQJ_!&wHSs(GYZ;S935MO%wr71*czfp0XHs)9$hO=%uQ8D1T_Xyi{SMVJTHQV zRG_U9aDs#pb^3Y`3sHyB6i~*|oc;aWJl*k+q-kL>9lMjjZbCF-h#lrZas;I9foGrx z-Am9h9!(~2dj&jx<9CZ6)bd6$wTcrS7@F*m$`e#sLuz7BMG3C_AoV7w2GwLmt0#*j zKs6?4fCXGHLI`lJ$PXU=fVc`Y0J02JFM{f023Zc&p$;wNIuBIef#$KmLmiV4b)HrU zV+TVGV>1(YSfa0nsi?1nDT{dlOAQNXP@$G3FQtTO0c#3V3iCpyT9y=+6jtzX1X~GH z7CX{#L`e-(Q4&Na%5Vf*3M<NRL>oxo0v4p<2zJ<TgeFHK`{;l}ei5h>lQKFBrI0&P zW})CsVo2u@X%de%0}hbF1Ju%_&X5DN-~;u#2n;%;mL%&}q@*J%2zBsu3R39_H3Za4 z1WkK!flGLlAqIr&30G>cS_7pg0X7m;X(3l+`WQ|FWkYZu7|DClnXw4BgPZB8iOCrX zWr;bZsS25SaFao%!!WuTa7Cc82v}8z-=W~%Gqh5qd{_bO07RvUqvwz8Yee5499{7A zY73s4hQtxIhXar+Sd{t|ltQXFVDW|0Gp0gEzDOQa@q#+bnn?X*Nd1f2Oa20?c%eOb zWpDz6q)bqyJn((^9|+e$`tTf(W(cSw3~7dd8yBF)2e{{6qzdx43aGb_-e)fYO|L*2 zEb1UdpkP4hsPm)w{v60|P<w|#j)Relk%Liyg$JW!UZlgozz_nTib3g<pMkYcn2J(B z{c+gZ8t`-n(o{?hL(wM8sTlBj8kRghuxikh2BeqHT(k)$lEMmV%jCgU*z|zKAuDV^ z{d>4NNdG<$+X@>j>S`E@PSh|JodBB#vKKK9z?H~C^a`8g#N>=rP~i+NU%<H&I?xPS z*#RAV0~Ic#OKe7$*bM&Jl>CCsJn;G?*b*D~ni_EB0h$Sdt!n~}IzyHxfySWo)4&xK zD5Zn2k~1h@D1p?2)FmYrr-EmaV6!LS+yY(k1s-=s(VdbBUyYKKnv-7+%|@_>1*lJ@ z0MB@Y+ZBlUda$dC5sd=4t;mfFP-hV2dW13s4bUP4=vpJxk^YDPNKKD>dID+f2zYe` zsp~mnz>bEy6uEWbY!w5U_&~D5v7i7na}fi!3;T=%)I_k6{_ur&;E{juOj&VhdU|Rx zsQgmM%mWMi2D|tvq~s?TgBE6$fR;vqN4-I9KJWq=h4g$_g9;Sg36NO<l*JPXph6NH zSCydERheL;GE+daYsrZ@u!NGApQj5QiUK<?v7i7xOQoOzG8-BT3a|+>&{B^CP>O&L zeIzI(Cgqo<YU(LC78DdC7Nmg<EGR93B^}U;uj2gN)bfnfqErQ~(!7+^A}z3Y(=*Fb z^FZ!Z07>a71n1|bDx_8<<`(3n79*BB>FMdk_~ut-=Hw*CxMdclrsY?FCXc{Ny<%(v zAd9}h%YmRF4$2uI4ASVBoSPaGTw0J?<XBJuk&iLdGXOi%Kfu$^)8Eeux&pB@FBu#e zkla?RfR?$ihc>vC3mY%VEQT$OgXZ28h4M_$qS1_0g#>7xhcpipplcE#I>DnRenp^# z>29}J!3hyOhEgSfo~Lf{fx88c&K|Dd;i4)IST@pxwq*#<M`)sttK4FTx((8v0X1bH zZ9DMT3LiMu!Q}v`701ZPz)%coFfk~iPC4*_R+V5|U1ESd<bu+qq46|>Fu{Qn*fc{i zX!$faC5|rE7+t|Tx`H>q9Br8dWL+VsZ2@aqAnKUW6}*tnK1#a@UZQ}*3Ew0GY?K3B z%z{D}RLX+uCr}-R)M7#`a0HcBNX;hD%7*+RP$L37tP&jJ7y_vszylL0sc9I?a-kzE z*sTWJjTj0+o<GPeR&Ys8%1q2tC@9J=$S+RJfow@Bw$j%x&&<x$O99L3<rk&vN4U5< zB^IZ;KvywW215&5@a`66aQHx$BA4VVq*j!G*WYKPg4WgGSci)67p$QQY9WCakK<a2 ziW*Q@XDPrHD#B>wb)+EO)Sjt;)TUtHgW}l=RGWe)D&)~7DvZ!;O;F7Vo}BMM3<M~E zyVcBKk|l*{A!yqSQ!NX)6VIH@ROC~_3YxsHVQOXuO;gk|)i4+3fmJitus}QfN+oP~ z)UbgD1!@?IT56bzT3|XMlOUkglA7#^dx@@PbMi-L^7HfbMt8{!hg~wzCNp9tpWH6I zPkwqaaXok)@Y;N(ocwf{dT>z<swO}f-1`T&)8Q>yQ0)Qk_bU+7*N5g$f;E-`qE`ZP zJfbFoI|pPhq{FVD0PCP2l<9*kg3N$}dxMZ|2F~zK4ere(5Ho2w2mtaA+!xds0{|Nc zHjz3*0AQoQ!vNqeH1<v@Z0As=o`Qy7eo3m8f~R_}LS|k`YEf!&Noopg5CPWL1}&c{ z2UVt^e!4<AWcw$mu?Jr503Jk2RLIFsF9sznJxxe+hfwbs<a1a$Rlw>_uwTF(Xs{K~ zaVl^khxfse5<6sT6qW=IHV3?m5V|pq#NIb}y9pm^q6T-#-EOgfd~u68CqEt55J2>= z!P5kwHHYB+6GfnIE=Je7NFOvg0G?Gq>sIrC+j}|r>7Zsn3aA+XnqOg1;9z6}PY*!0 zX@E9r@IY7ZfwyXyf|>=O1%EIMY8HTZv*$4|Fr+d>F{Us?F{Lm@F{g-t*CjAUv81x5 zu%)oKFf=npv894HQh?d)sjQHV6wQoL9I31+JSn_jan4lM6uuOGFq<otHANsr5X|OI zWla%E5eBn)Qka4nG(~T*gT}!!i;AlZo%8d`Qu8uX^O92)%8Nkp2if_M4%yrVN=>lM z51>?3tmo&J3|fBy@&||pO&WolH=re$p#8t`3^hzO4DpOL%ry-0OrUjz@ys=>H4O1A zDGb33nv8y!fel_C0-Bi7WV^*uoSKt{bpZ)T0c3mw93|jE4vzTv%)HE!`1qNim;j$0 zz{JJ~fmH%fPwK%GCBqiVf@qNA!43!6Ucykrki}TTki}HPki}fXkj0Y1*bCbB&E%)a zR0LY=30}ma$qGp`;B}_(b)XO_#v*f2ngP2FOn@8+R=yDAHqd$%1|}}XDp8oLzzGS~ zaiGX)ppemIEdq`1pobh-3cJ%l%9mkx8h8$jDoz6ht|n^{X!#Dh)4)>Lod#0A8pUbi zD4~X!oTNs$fhO<J9fv2}K*~2@cN{p}a5xT>;lb$*v}6i3y`?brG6yqgGWlsTg43EN z3%FE5bCV|aumY7|TTz@Nh8k9&!Fo_(g%VVxxdzm!A<i`*mAmk`2Hu0Bz%`(<lsMOb zRPIM{jR;EEK#OrrRzE*KH#be*TO9H6pna_I@wd3*<8$*<N^?@<<8SfA#}}3+=0IiG z<Kt8EljGxyEI@0(IY2$?)S{9~a8`%pK~VAqPYFY!5fmmxAg3UeUWgLHjDdk+I>?Qn zbOGA*$H2(N&clj;MIaUM-~ts}pt1y<lsv#)$|AlL#uTO;##+Wa4ls+UmJxK)M+$2S z+Z^T^21$lm@Y??x#w?Z;_JvHf%r%S)SZkO;-N6{9T9#T?aF>vyY8tpQ1|5T-0NU3N z+0~z#oRODVSemMkSfY@WT3n(BZj^v`&6F0Ug4%rWZ5H4Py(l#uwB8HpsDbp-#G=H! zlGIdCvjp7yNzN|<?U7bU%quQWh155RIXMcDc@ZtJF`&RMh7PlX600Ai&Ppsvtm1Rd z&&|!x1I=H6=5nfd!IL>Kt|oI4s2(Vi1(n92q4_F@;QX|b^2DOl7+=_4@EB;LCC0h5 zs3<kBBn)!!K#XfeK~8>AYEevZMruxuf*W{~X|X2TE#`no<6CUynR!L2>9^QHJ5a$4 z|AN#!@6^g$f*#(kk@3!<K|!v5A@QNXu0gkW0!veiD#JjlX<REb*=}(q7iXsAfRk5| zBPitv7K7}7Ze#_E-(t>At-QsYl38?%rKGYT6)C-dDwA8XXuDtIK^vvwVF7*|l!!ou zDg!GEBNr0~GZP~ds48RvZ6aV}5@0Oy0yRQFbswnm2CXjv?d=68qy-EN4B({0kjq%h zn9Eel#K=$s+AzRa!UC$)o0(D=Qy3Sr)G}8ll(5z?H#62Ur!d#DRLIpZyD-Fx)v}hb z)vz{$c9OCbS*5VnvIH;`T7@&zuoSgails27Fyye;vemFH;HY6<$XLr9&X6a<!cfAQ z%~jL{IeG?i;0#opE1Rom7P5E^sC;DegRK5wy2Swwy5#)4TdZJ~+spr;1sIy#xA?$k zpCsq!>VYMSyg{kJ2Nc}=!5;3ZC6E{mNG!>?#h#v8l2}qwbc?+-FEcqmCG{3_eo@LT z4zLM{1(~-5+*3<}GxCc{K*~WARkyf3b3uFZU5kqHi*E6RLbQQ-n(RfcAgkc^6@l{R zE#8d8;`ofr^o;oAjKrc_jLAiyy*cRdDuW)cpxLMRf=aMU?t`Kgw3dZ|QGij5g^7`a zg@us|ycw8{k%f^7ycL*_k&BU!k&Uq^5<QAR(F~4a(C`yDA{c5JK`UTEtxTlSff2l& zm$`;93%p`Bg`tKig&~EphIt_?BSQ*1N>sCgqnaa|rN}9T6CBk};HYk@VO#()hYf5F z+XD6)<}8jH&{kpQqNW<QT4oSGm_d^Z5|uAO#o$ZOHl3HCB{mpYH<N*dfx)fF7aX~q zx7d<FxuW=%XmU|%Vo7Q|G~VKqO4HI(i@@14B`4<=J2>i%jcy5`MR|Bp5GW;ZWTzJ8 zrREqL-4aBP;qY6m;EoL}I%7fVxgj|hyifcVb5dzqQ8*~7L9<}DSdvQ9jEX?sfDqt( zDvdQhA&&nAicU~lnSl|JL%A5mP$HF!QG}6&sVD<EGC@TdJTh-U@+(6QC^Er?KP1nl zFs3l)Fz2$=GBYyNFlVu5v8AwxfObfOj@4nUVF4eL!<@yD#R<-hTqz7C+%?QuJT(l> zOer88JXyRote_~bVanoLz+c0<Kwu%mLdFGx;N-!c!d}Z!Ay>l=&hwllLN%Ptj47am zP?y44%Mrj(SQpMv!%=jl2Gu^{EY4c48m<K*HS9GYS1=b{!ESyHJ0fvtGTvg&%1hK_ z1o!D)f;t*SpfLZ%2u~8Cw^$R4iV`btv4eAbX<kt#D8fXbJiV;EM7@HX#FDi9qFk^k zx7fln^ITHXZgKcJM#Kj=hIrg!tx7G*FTTYNF7b_xZgF_}1&28LIlC75gJL-VWFT8` zMvi|{)-9o64|lhK_>jl|S6E?xi_I?)bdu98j*|S~lA_GKbPx-)e=aW_vi=T|=DeY4 zt|$bwER7pdTI7Ii067`rIF6*!wD{u8s??%1kOZjM0v97l>5UDNb|Hxkob13UP6BI+ z%gRd>VPaq?1~q0Gz*D?DOgxM{j2w(|XbBD^#>XheR8#|U9b-{E$k!b4@wthadGYa4 ztiF|w1qD%@zLn09BY-s7A<Z3dO9#{fEkZPMK>Z4E>!(UkR~OWO1os;iRErgKb*og7 zg)~6r9CSuKF-JiidNzZ)W)-uco&mHmT*anZY^9)DT&2l{p*O#@1gmy!LP`^1rzELs zR%u`=1`WG`wwR_Us3WP=WGn*p`7~KTtwkJU2$Fb+rgo7HC?Eym<Dp)Q&&*59kB<lM zUA)Ddn+V!tSyFV18=)Zn7ISfBF?dzuEgocDMfRXH5ePDm1D2+5aTS*&7L^o(!toXd z=oB!JMYq`Vi^1&)$SO%t$%?;SdW$VTDJwO(1l-aDw-Uhh2)O(Kr-&j@IS5V^Mc|E+ zp$rTRQQSzm>=tu!er}N^$c6B}@hw(R)3_K!W#*OKVgVg-c8dihRs_maNJ$uxjyY@~ zjcz+m(6Y-i1_lNeb{0kfW)4OUCO%L@h6$8X1sJ)&qb+Q#Y)ot{T;^O(TpC=)T$Wr~ zT*d+h91<MT98w%oT#QWMv@QUyBRLoa7zJ3lKw~mYEF3&cpivnvMj0m1qD}}6VuAQP Hj9iQWLG3-c literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbe0e4795a0555b13790e692caa30802cb76a17e GIT binary patch literal 36150 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 TLr{QUpq>E&bJ&<U#JLy&=-GnP literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b138dec2d0a32a16f06a22aa3d37ff555123aeeb GIT binary patch literal 66460 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 E02Z7{H~;_u literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59961d5e120da6498774cf09c56d11f379fe8e0c GIT binary patch literal 220615 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íZJY%8L(m{XX< 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 Vv?w_>9u%aY z71!#Bwa_3-K#4H3I6glm1=Pn@sL)iX#&8bg$N>e73RNRb$ko&!ogiF`um;2h8J3co z9AA<jpOIRj0V-w`GC(9YQ!~>PG{BOeD?HQ<)D_g!Ac{e^dZ=5fW77k&1m>Fjq7;aJ zO<fRE-9TLv&2=EvwF;>@#i>|41(JjrWoV!cG6L)xsA-PaO+yJA$kD_ggOJx@fl5SB zLIVvWBgIm2Drm|Bx<wr+POz>@Qc~3br8LcA1r1g3!YR#SO;G(*Y^9*80ZKcX#YzgQ z3LtAVxgc?X+2w~ss{$xqVVa|()id)-K$)mQ9eN@g$oYskLst!oJdkp5(7?1*>A~s* zq<R|K@CHx7z$%iARE6Ti+*HWDjj#jJKzkoRoqiAv>f(ZX>Y#oxXf3fM1L(pL#957+ zj77UZ>ydHqHY*c@ZRU{y)kBbT@eqRpu-!cHWkXc5wi0G7wGFPPmBGz0gRA_pMIWpl zD~2x*f=nC~gQo<*JHNmULqzQjYEXffrB{hTLS6wp8i7!tDO3dR$G3vUJHR`Iz<qnr z=237rzDO7(p${S^f)-<edhJD^-CvMn_&~RHLdFHan}k5u+ahjl*JK6t&QtSJi*B)j z8po+cpiA4qZP%g)ObiU*jy=-&3b@A|!@$6x3kn9%v6~Ezpx!YTBc#90!6?JX!z2M- zO2on_0lE#1NeoPa`qNyDT1+aS`z%2tRiMNR+U5y5@dLy!egZzo0Df~NGx(qv<`k9| zj#?Hl8`SCJsAUBmxYrE2fR}wCBj`xaX2x1J&<&>`ynwZa1+*J+0b2^kLdIHls2KA? z#szGk9gDRbP!U$J2xtc+XAM))vJ!UClyoy=4ZAo)2}2D>2|K7`Ce8p61$D*58EQB| zbS+n&3QRRFmCcN`Tr~^}I7_%n7@HZy8NgG>TnpGzxIyRHY4Rj~LM+@znkEJ}ML`Wq z^oDR|9%z^sJo~7Sl#`#F4L#Ep)=-2T0u5f+Uy=_!a2ldep|~Wm1bmMQc;Pj4sW+tD zQ~=dw(DoK`Hw{ua>p~0&hUo`25>UGw2<Jjh%*#(h*alv#3^7Onl)xd^5JRU_pgkXm zuToPW7C{v2g6>66%_|8m0iA@d3u)eiufGDRs{~(!kXi(qsmV>uOH5CNDu)D3F-Q}{ z90kyP7PKi04+7A6H=f|2OighD1tU_o2Hq!woiztD2Rdg7+Qn0vlcG?Z0a_pqX@%#5 zj&cCS4A`~MMg`0Vpy}EC{G3$qc@OZb-pirWW8heX7ZHe%NUh9AY>oo;sz4ZYmkg-I z51w7MRsbEbSCX#)9;gO4pdp6kr-7%`baV5IA!nz9Z&riHKBBjmkN~~&3{vAcf>tGG zLSq5qBv_v(u>^F89%wOtUaCSu0@xmSf&fjefddIgTOF;Hl#-gJ;HXiBQcpV~55$8n z@-i?08wsjS6%^bRY!w`hkOWXU#&8)YI16NplaofGPLfVCid9Zd$aX=LIclINQBX)q zN<>x#7C^QiEP$}q8E&l$oCPwuxF9iCqe7<=&2&)4R7g!vFGdRmh-bkE&BKiWwS*wi z1CoWL4{$0|uvLgQgd8aYk|{391)ZDjmR|%q7)1lxX9vlE`wXB}n4leTNT+Eabyc7# zRzU&W0&+=B1}*H@P)bQn1KrMzWPmobW1;{W@Ih*q!+Yb9hB-oqrUGc29cWkxOj{wf z^+Am-Sf2#qFKA}e0Qp4+nxVmdMR#AC0<4FGaIiL*2{91K_eJ1g00mpn<>t_k0R;*O zgB;)t8gqadhHy6MW^xUX-{E~g)Sd^#R86p-KpicRaUcv4SFo{B(14p>1L?IvVxR_c zrVOZmh_u8!u^2Sr2ky*ccZ)5^EfB*IVF3yzuvK86yQHQm)PUv!GSl<GCZX7i6e79# zDWy5^-k^V8s(%q^$0#_|k(7Za#6yZwQ$c-8gcis&47Aw|>MbMO1J|Kf0B$_P5+Rs_ zvQj-dT0JE-O&xgxQQZ-R8?CMZY9?2K2u<}^6qQz}Dx=jM4Z&CPq1@$XV4xlgx&S6x z-5q2G<mx^nh?u$~?500s_1IWs!$G$J!n2+N7FRksp;``cW+KRnBoL7dA_zLz$qD9S za4;ySJ2`>QHGz5>q+LPX3N)D*tqv-Qz`g^qpw3Q8N(4I`&F#*}PE&V5=3(&(sBA)3 zq5!qM0_1~A5CL)rA~3)%LgIpEB%!Vc6=fjTLIMLGXJ8!)(b4LlkseS$$HFHoLCri+ zvkx@02*RL-EBO4X8b;7k{bt5&)*=DWjnAO@f*OWqCdie}pmXQ5nTxzY*E@sREJb#Z z!!A;oKnEU{FoVXuQ<y<)kZw&Dzar2fTUGp-IXS86i8%_OhIM9MdX)gEOO>clkeXVg zkeXLgRH?}Vxd#q>5~2>M2@P7tk8z#yEw<#+BIo=ZO~zZ?kU|SwKo!Afp>FXfXQU=) z2c)JJL0TC1LG5FZGy@|K0}CT)rU`T}aFrTFdn%*>g6LqOX@~EJ00k2WgM$imJss@q zN2H)(DN^bHP0lid+L?Jg$Uy@R4rXX@@IicET$%*&J2T_}$a6ToU6cf#G%W(T2Fb5{ zV8;fRCPBRV9OPBdo(%?wH<_wb@p%%i4`eDRH86nu2f|=Kg3c<yog6wCip=220LEsL zWXNVLc7pmFoD4b`Ks^IS$So7l<WN-2$iPs=4-SMph0;8TBT-TSDDok<P_Q6v+yGzM zfjuaA!9fuUHR~NHBtU&|SftA^@-SAZKrF%@<uI*POq>e0*gXAQT>V182e01Z2=#+- ztN36BKw8S0+>macEGXWTK%F!N5FrlYg8P2p314t$4?L->0+JN~#U%GFA=EY;s8J7z zT|ZFIF$FZenhGM)KtuvaES;Hw;TB7Pt836LwotJ1Zm|{Tf;EDYw<aS*Ke%I9#K6GN z2MPnwQ5Fn=JRCgiJnSNj5{yEOLX0eoOiVgVpbnw{W0i7rj6p@Rfo_aJMT!}SumCaB zK+H4<GcC4C9Hc1G5G0e722x}mV^EQ19$Uo}Z&k$(+CEm2m|i83UZRjwqL7$dppchT z3^_VbA+aF8xQflrMomFUy^2Ro!#=<Uv{0s`(ymCD8FbaRrgfDNWYrDiiYJIH$|wY= zv;wb22gPU!D1$L%F@Za9j8#F<jqBjbuLx-YSrO!DP1w$4(DrChNt0QU30hK`S&{*o zB+D#<oB^Ad10JqU1f85+tjT<fFCMhP&NZ(jv!v2Dv7qQ0Xg3iX#A!HA3QA{SVBi#I zU?>KS0WmODiRi~@fhUu-VrxJwMSV?8ttuuh{VINEg<{Z<F4$?Qc_mf+Hj28s(J{p_ z!LeHQy1I5%JYd&?LIotvq^DKIQv|vU8q~AM%uB5j)YsRrw~C30$*YNui^+@C)T-jr z*N2-Y=&Y@cW(Bjdo>r9ztk;QbyC!2%8t5DpCI!x0oFFR`Jxfw^p=Z~itZD&GH#>k1 zTVBD$zyM#>!WhMz%96_3%oxR%%96_7%oxRy%9+a5%(#FXbO`?fo>aDlj8VL)oT+?Z zG0+GA4@gG}OEc3##wh+&0niCY3%FC*7BWIr3#JM-Gc4dq<ygp=!Y<B$;E6LV;0BE+ zL<yw|Ef7xOOyL4eJ~J|;3Z)9BilmC9a5pn95M9WSDg+uK5NB`#spnb97$ue}wm>*l z98@l+3Z(FYUBU;pk7FTYltijP3O`s(04^q(Dw!(b#E>fJ#IQhWAw!gOssQK=qXpb4 zLU1)Qshp{@DZ=6msd6B)nP~xcipWC7DEU-@6j88wVhb6g6jB9J#KAm?g^W>(sfsC* zsfywZDN-T~VE;%jWQ<Zu6@iP(fW(^_Q)I;%Fh#*S<Q6hUDW@tgP)U)8g+PizssdO} zaUo-rYN}eQQmU#GL#i@31e8EGxG&&NQCi3trJgE~q6~J8%0k8{ja1DP+Z44F^%llv z#we{+%@n&7%@i##Pdim0MH{SAXCY&hPO3nPE|{mckTFU(RUkzl%rjWX7^Ro04-Rz$ z5b4AaWtgg&Vwhso!qChZWt6IxYMg44V%*Hg&yZ@`%mA9;PvuNCOEFF{>16`@(LBWz za<UbO1cmkj?i90yj8PV;mZ>7CRtu~bGNf8KF{GHMSoAW1ZM9s;7-f^HnaYx41quO> zz9?HT-x|)hOR))N(6leAVqjoMl;;M`zJn$?i&7PeK|7*BX+1wrAt%3F7u=sm8G|Uv zNGt&_Ku$^p?F>&V%~61!QJGbmTc8WSdInnTq=1%N=NEw5{jg=vx}Yhi)S}E}(8xe; zu>yPnCv@pwu?>`AhjguKQEFmNu?>i{OMthzVKaWk$(f)MC@nKtArHC)-ljM?GajNG z+7HkLmjd~D@cG1oqI~ek31~PA(ZMRVL9p#0$7m?%D&(b>fbNG>NK8oqZ6`=Ya<#9c zvrTSday(QDi}O4K%1mrB3(8E8)WBWg8Bk^hk~Bj|!X4}x>~CRaU<g;6l30>jY?E1> z4-y5<5~kWEfL1ra8o#jc0I4g<%uPj63KBqg2&ObN)YHYLv@|mXQwo#}5_Ms-)+ykD zE*r35JX|myv{%6{0WuB%-edr+XpoMPfLR4SaWo{~Gp{5yJ+%lPxEKoDKy#zGrCkzB zQt``z{EDFhG|F87sy{*!(~B`=OAA0pA%)~;r{-ZwrsS9BAxnb;9Lt~*#&TK66e{i& zp~~RXWkIuP`9%t#<O<3gNvTDkUF9XEMS0-Kc~E_<kXQh^C%7mxu_P6|Zy)RgP|qHO z4N(TA6clvP1+>uxjP(pn3{5RjOfl0lFiJH-3?6|^PSrI;9bZB{Y!t)CY1HvDczPVg zb?81AKtDoHmIWnZd{LW`S^<qt__7&LkSd`2#LW%Gql5w&ba@8oIvAYC+A1rgLDity ztB)F!y2kn@q}ZIBS%FykjnCs?g}5AnVxu7;Cm9lOWM*zbeo=`6s04!>jFBcmvN#XH z1xtd8L8M_X>?Ys|aF8Kz`$3UxXk-k&OGg*P&^0wPw?ME!LLd<o4TxCB9F?L%DS@2k zq74lUkXC@BWTa>i4@nZG;6T%eUWP<N1(39(7b($T0c|5=BsGR8MNBl9izH2)=TXZG zbl>XX_b-YxhL2HXp<aYX9j*L~t?WSYm60j(sl`Y|NVJiuDN68R76!<<F4{m3Svg8} zi`F&JGe?$HR=}0D5t9<2v442*kZluczK=FUcLz#_gJmd07DKRLa&RX_gYvqDI!qj) z62XGWscS-}F>bL#TclOopm>3Dz!#=faYSqD#@ffEXjk!phRPwAN`Yzy@KL3=IAEcV zz26Qx02s0wqJ{x<L7X%L_`nayQT(6*LhzWDChkQMmp~nB&=6IXBu1eHTM+@i1FcF4 z<`U5Id`L7xJ)#Sfsp5rsCPptNMXQP%sYOzy4U^M|PIZliacaOSQG_(@HLFyRbV7C? zVQHgR$-+#D(X)?9(Lyuj7CW>pQM8ANf#DVxqFr9)tzl#uZJ=u!TVoV$plbrY1~0b8 z&>pn5J+|6V$Ea3QBSw#~BF$>!+A1DU`yAG?uMz;60bL(oZKz{XdkYljunkW|X3Pu> zFG2nNDnZbG90gGG9i~^42@-EDpg}w)E2}D@;tWvbgscX8G5~E~0WD7lT{m6>K1{Ef zF@-rBlo(hL=iq?GPe6l^;6rJ_XPq#_iq$ffFk~?<V5(tU$XLXb!Vt#5$WX|X0y^u2 z3B1R{Pm>wk(YwVJpIK0577x1ZsOT?fD-09lj2sToKpJSE44l@$C!ZF9Zhd+WN?H&* zt8{QCF2wk-4eadNA~n!R9%IpQ{0CEm%?Br4b}Os2w6rv<Dj`U^L=G@;^q9edxXKDS zdW>o{qOJ6FV>QtP?X6-AQH3<CO=_#SeI1=)2L0ktjnq}m)m2S_#|X%)paC@y#&N+? z;$21t26#yV9biK~*AU$6g?52J-CNM6P|)sMP#+U42fk$izIUM{AA0@^=<bD7P_IP~ z)OUk)r$EgJ@S=xe1zotE3c3nuxuA{DptIo;!B;LMrGh7BQ&T`|4nW$$<`kC{6@VC^ z^^f5DcR@QBm0+F*El)?-f~6+|vK(X<Y?B^F{3G{5^^)@oDm9?pR*+5w1+a&}n$a6x z7$(8{g`j?&22v{wWD>YB1X}!>3NZ{Eh|ozsB|}R~OI<@FU1LKf<mI1WJt)(9Ad{j& z-T{ROIEXbsdUX^GjdT=@4WY$6NEOP6Kj^$(@QA+;0|P^)2zY=Md~0O~!$PJ7OrUev zSr|%~v$=}g7#V7r85ycXK$o=DFqW{^FgG)TCVN0<IHfSuGS@LjFhDLb0nc|ZL5{Q5 zWGe!twp$#q*t*36awTLj6?mi{dba#@(8xLXh$hfT|1GAnR87WP%xSqLh&+3XExD{D zJ}r+^f`OqJGS|VxD8eYfSfz(Q$PqahVgT4kO{Su1P`OY8B0z<MCL=@uG>U$U7bVWV zg9-{z!NefM!&)VW-?m>OurwH=>S3koYo!{jr<z7mCKN~9U_@HpgXbbpAcK+ubSWb! z<3LA%VKU%E0#bs=CA7+m$l*X-zAORf1+1HGk;aBVuE&})A=*jHmmtG%<V~n?IC5r) zk+GGjrIo3ro~5NF$=MWaEpk=`-Oi<>U}_1$mX?+V1_lJPuLmgm3ZQ1+U<SlZL(r@X zo}(>cAu{W-g0pT>1t^1n7eC_8uSHdm3K5*6K$!_r$%68h5^`=80OeLA{P_nIB4p%P zL6jT|GDHAmGd$NS5w^9;95hE&nVMK+7n4$LQmd(9Z>0+o%FWL!$*_w_iAjMAr6g8D z1T^h6?W=fT1DT-QRn-R4gJcZ48DKu#fanl~SdfN{{8Es;F)5l>AZ~7EUTH}x#10Lx z2;|&Uu!sh@Q3|qJ(;lR_q{=R;2GrIBxzWlVL~7bs2_U-)6e3li#w6@I<!Xys4PE3$ zgh?%^wTL2QXjFTP1=O8@*BYSG92BPDNjXsC9@;nq*Bao7IVSK0Y{)~Upwb6&2^eIa z4}4TG_%^Zf)Fkl9<`D5>@bZ2{d4!|ZRt6Vp1rR-;6Ss>Yx3}fx7v(1AU><i0I-px& zAP#5;RktN6IwdKfBR@fFc@nczVZ*Z;N+B*tE3&{!K?fDYLtR^vf;c)9VgSaOq!<Yr zW&9U@#HfO{0>l7#<p8n_+=S35fm?~PxCrD1P2>|VK{^78K<6tUpL`Dz1+8CFKtAyv z?kdE&^>B;9y$4up9Wv1x4|a4xYEe-yXmLF9ofn|98o^aHgn-n`VCAqtGzR5xP^*?f z086cmqO|Bgq^%B{@GQy)6>Fd?F`)CERU+V#f7q!msgUUac(n~%YY$HMkjZG!>f{BC zpf-{wcndx;chz`-Tny?GkZiCKq=W^vjv(QIC}u$yf%w7<_S0l6Du<}815x(qyY&x& zT3VnBdcYT;-x7eAo6uQ{Tdd%rrdxb)3Gi%15%@w3&}pDW;I$3lRSpH9KnwsGSOQ{! z*2dg|juOB-l!YLf{h(zG;FS=dbrQFD!QCLZ5>P+t77M6HeTxG&tyT0HbW|rBWU##m zR23oJ#!(Df5W#~y<5W}z5)z6B^;sd^K<ISUE#Y`@Cly7o=qSi=;drPsK)pt&a>x}O zAfw^)Rkyg2X1|Iaf_z&G@>4y?MjqsD!Yu)09;n2<#R3|~DFUUMBG8TNMU5bxO&|ia z`@aahF#x=X1bkD7C1|k$FZf`Q#NyNf&_>lFP}3Z8g$U^Skz0^tiZ(%2Q~+`nXxR=@ z+CU@_&@`wHs0|BJ!BNj3z{14A%E2naEX6Fsti;5}q{PI<B*HAhD!?qlEWymj%*QCk zXav5lNroA8c@vKW6C;lVA4rB-fRRUth0%ghj#+?NfDvVx04OVhmkEH@o*<S9fI9tA z%%DBpEeugCDWFr@*lr2M=Ok8Df{!o+&HJPll~lsdJO!Bp!k}P-Tu#GS!w}C<!<Yr4 z8EY7`m}(f}nZO+lMo{<vFerI}6E<i!gC<ka8c=wEMZuu}CO`#9(K-eOh9FR00d09; zU}OWG<|>Wp6utQP%)HE!_;`552deZyJMTdiU~vuu149Qx3PUyrXxBYxr+6nr31bIn z|2<QYRS6S#s{~UDa|=fYLl$!iO9}(%3`Ec!0?mv?4w(!c4Dl>A3|XvMY>*{nSuEM? zMM*Ub3s^fC7BY4)WU<sR+b}?ANzfn(tKThlaCRxmgO?nj5CZwa7_=}$0dz7fL##wC zNH+s$?OqB)IzuyaHV4Xh$#iB020u-vA`lI}<qLXCSrk`sX+dfcI65>Li`IjJ4-sgf z!ICIYpn<GpVW`r@8er+ECGqiymK$QU1bja>d(i=qq0*q3iUZ|7_W1bRqWt)Hh+DvM z1&%!E`6YcI)gX63&d>$zAp@svnCn2Xd5b+h9&Bqk$Z??72m|<>2rY2Da)BC~Qn;N8 zy3ZP9V-cu0hn!>rN*zVBK)Dm_c?1Ent!NrE14AIlCQw@7VB}y0i=gBHQ0f5Z08pWb z$N^Ez=?qaUsjQ%TYQak**izX+Cu4%y9I5P}OTEBs&Q$gkjucKXn=6$aa<x}8V-$A^ zPcVZfZ&3|sK?CTR7jT{G2;PT~pQaF+mkHWPq5#_C23g4jIlU|=F)zI|F+Eimav*(X zGPvoKmtG7Sx&a%JkO1B_Tbz)fqmYmQS{w~wfkk0l(B8O&1aOl9)L<wEZ94!}{*Is( zd?1VCLHi*xi$SaFGeJ|jNtH-f5P<Kj2XB1=ZKS|(D%cstsU@Ig=L(6CGj);9Y)?pt zhZq2I7j&}?aw7yP3tE$}VNhXUU}T`90HV!PHFXrgB8gCuv@}f}=)3{k;otyFPRs+J zj|e)%0KB0lHAMlkUmL!aJ2NjMwJ5VBF)uk4w9`Ewe7+j|oQ~8Il))HqE>dvz^44(9 z$jnPEPSsKHN-Ri(u)On&QWNvgwk3d;>4L)np1HwE40g{P=-`-ihFZo7ml}pF1{a1{ zt6HWSrV_?%jv}c5h6=43rYt5GhFAsA-Es?<K^;8M5?#<S7m^I1Ls&tptr!^!mBJYc zdBPbW2@iB59jM@HW&{;W!3>&gkP#d3s$KB7D%>rQT+hG&-rfk>@&-PhoCh>83o-%e zXmU_n3e@O;4!mN!Bn)&ec@-!VflOs%s4|6yA}9&zfpaq`5f{g&<rhJt7O6-9Eye)f zf2he`Gy{}PLHXepJ5*tjKB#cv1Q9VH;u5Gu$pR_N`av}-Q*v??QxWvWYH;QT<?CCb zSgi#e=2Hw(#K6SD2s)pJiIIm<g|SMJpo8H72Wm8eN@#FB1{wlSVO+pa!dSwT#azR% zfMp>AC}Kc6M60wxn<4V@^K{GMhcF;zX3+jy@D6=&P5>`W)nqLKUoZwrCq-?bvT`M8 ziRoNW=p&ckAP+z~<Ddpc4J_apnBm9FfCC<px5;q4I>_<h0wW207#k=8A*B#*hu>m@ z+|>eh`z`j&VzB-qJnjb-tBpwR7ebB)u<l|q+^z+3dtPZSc)3<eW_o4`ap67>l=?v7 z4sttKA3nE(n$2xUZWlmyJE)XJaXBbwfRhZUVglv(8ip)JaZodWu}Tx<Ua)Urj>Z+* znoN)eGstdOr3p?AU;>oz!8hA=BRNYH*;z14iv2Wsu=XKlgM#2NDCvP>4O|yO?z;oU zR1wHpum#{+8;Jnh49d4jAe%vs;oxOqWMSgr;$a0rl=>8udqBn&e_%jec$&hL%96#J z#+1$&#pcccX<Md%7NIgnakw+2fVQbJq_Cy3H#0|Zx-+D(r*O0|q;P=wT<#2z<)bNF zU_Q4yLkf2aPYXi|517y6&XB^J!q>u(!UyK_x-+EkrwFt#qzHideC`Y>f+<2R3@Jij zKEFEy=n~5oh7^%h-c-I+{$|!F0e6NJ(G;;3h7>Wd8bNo46!8>^7KRiFFki@>Aw@Dp zs)Zp%3d|RFXGoDwk!fK_kpc5XQe=Y}H06q_85kI<AggB_A!itZ?yP}UlA!JR;Q9(Q z`2y;_g4Q%bYkcIIxmXWex4Z<k5m7=Hl+eJT3p%$9xwQgnr=&AQv4D@OW37^ack1Jz zDMZf)bhnjZl|HOG2Q>gd?g5MI8p2y7&KZfIr8=oa3PFi^>8YAbMGHX_jCG)*nd#*M z1_p+g{~17SQdZn)43tLD63{I+utkQ`L1_q7268a6FcvKZT}%k-UBfV_00w&yRQRHL zFr6`qC51VdL6Zfi_Z)F~&k?uxUNSH;Fl5#<lI<nO*(hFGPF*iK;qsCbZZBmvfV||- zM7Ecl=A(FN1-h3685kJAu>{%|j~Yv$j19`npbQMkw4jU%%ABAK3Ce`&f>A6f!oduh zB30s;iPXI)H8s0R4?T^7g>m_}Sd%FeG^~;NA5@hxWirS!Fl36#Gcaf}WlDh9vJkcc zi0uktdw|%!5Ox5F9S&kMW=2A&Xb2SxqL?z{K?-Ui>;@2f3xvH5#6ALH9|N&3L)h0q z?As9bT@d>{g#8J`{sLit1F`?flMzF#;J{c6iXhOG8V4f_6Bi>NW6?_VNFpvPNnu8U zb7fIxPEKZWl>vG@z+`Ymg(g!bXkSw1e-<)4#sM>ZHOO!9B4QP~zlbdZC9(Jn(z?gY zQqX2UK7aW!Fl7Fp4^CAK1`G_D_6B75ksWH$dK53NM)xAf^WgmDf>w!wI;HN=D-Khb zQ(2pt!IddX3Tq2P3M-h;?#=+|oTjjY`5Y-6!3>(5Rahb#*2k$zK#ypc46Xpt0j*q5 z$^>7+?46jGm8qlPky(_Oo|u=Y16uyA;GI~Kn4OrHr~qyN7n4<qAx@`*S7I=C>47b+ z(nWVSSQwY1L8%iIi~A{!MOLsi+fm|h4SF0Bm;ID66Diz}un@(}hcFpDK6L=4(fQ=0 zQ4W~tyHPy2miiuqC6X#b%y@(*A3Q!>0P^8~vU~`$ct45{*MW!HIB_>?KyBb6P(&Aj z0;33|9;uZBZuEfK%C|URQMegoK4{4XsIkMsB)}rTQnVgD9N{fyP-_oYWtz?w#RAR9 zSlV`wAqvcT6C#c$3>nriFl4U34k^_HK_#3Zm~CLlz>wK*2xcd&1htP=g4r9cgVaFP zgTkMzQjiVeuEU_v0Tp$i&?(x09xm_<1R5qp4HwXg#41tDtmEwET@`|!mXaaI)ukvv z%U<NM9nd%##4!pQ&R*V{xPr<L^9*J1;59hT5d=8)nVr47kE3{PBf8g!t-{1Gy%>^_ zm|3NR?njU)F1KqkWis+HFl1WsfuqnK#E#}8qw-<_*>W1iXPeM{1|Lq9LaVtz9h4N7 zbY|Fe0=721V^LyKW-?|nhKS?w9|Ic$L#8wv*ne^$_J0VQfgO}|*~#!L8^q4@D8Ai{ z?pt^gCAGKWk(yMLT8`;ch&UdfPGALPKvr^m1Tp(EijTIS`-s?-DTA3ZT~f<Hrwb(( zWmXxXr%!|&9=|bgf?|sk9E%TDfc&|F41aPV?7EKP*R9~<T@-8a-US+L<jPH~fcBP) zz(XbA@*dPhEdq7wia^~Ua5K9I)Fv$gwc5a?Ik@O50%h_dP<|)^C6gjh$QFUD#8yLq zM+qi^TnAb+%fZaT$OEn%1Xu((K$V1mfB=gK3z)@H3MyW1EWg=uW9N;HH&)#2y0Nkp zRAoHbvG&=t_EOLdU>9~>*m1Gp!j22OFYLas<6_%|4W*zm^W4;PyU*=DxBcASb34!N zI=2RF()C5xwp^cheZ{pc*JoZ|Rm#c0!0>GP(r0tlyjV34Z0@r?i=M8XUJ4q?dfc@7 zanpVf+1v#YXx#L;sq=AT&*Mgj*0)pVyxO|<&9p6GgC6W`d9Y*pgB^=XLBkUdmMnX) zwEe-7tq+#0c(7#OgC)}+EZOj2X~Qj!`1st!%)I#cTWrOtIjPAdw^%@HORAXSRf>K> zCjA*fGqvo=`8lPzdBsKRK(kM5;H3}6pp({ea})DY61|y_7QQNjE)oD;#tYE{-WdpP zh^FL&ZU|8TYX*<UfJat9b0HAB6|^90QGz3b^&%ppq9PHiS(Ft(8|-pYi=j7{fbPy# z3U>8zbq-O2v~rUZi%W_Xl0c_!mE<cZK}=MF+W=7uvjJ?nj)J3;GqM$+0dmj;1=QW3 zSu@a$&v_}(eGMQdC_oK@-hPcR9~^oLj*dD`PCCxcP>)m=>!p+?<{(=FpA`WI17ZtS zFw_7Y1t%Q^H2pdXA)u)vBV=<j^U4x)GE>mpqo4~r=PNBS6Mm7ALIfVeQ4Ix65agtm zfG!3CM=cHmA+AN$3ULoo;NjJ)5EmB*3Z)8#V2n_zf^4h+r3~a<EuhUu@Bl~Ih=acG z2E305X|E!9*AQH5l>(fJY&_B~nJUCR9I)LUi2WZ37EBIqoF*gq{sm1Y@QN8X@X{8y z5YW93jF5>3#t_Y4MWE)&E$;aEGRWnk@$t9#;hd1n+|>B^TU_z+iKQhO`9<;ZMN2>h zB71piVs=q#S`nyLC}Lq`V1OKs2r4a$xInWP%RyrGAl6e5D-lH0frvXG0@N6|#hF=> zT2zvspHo}}YU|zN_5|;bb1f>$FDe4f&);H?FUcrMO-v~Q6>GORA)L&-^jrMN`8lBS z0en?jVp4JuXqQ6~Xw;(!RBjbLWMp87;?6HhNi9lENy$tuDFU^%L37NBIXUt1MW8zw zZt=i;3|jM4R10#K8>l>C&rPf-&a6r;@&!2`w5YiVbWG$e=H!f`B2~~xIcTz=2)srJ zwA=-9<PB(=>J~>)D#*~(lp^qj51?7ABG3$Z(K?V(phG2!N<geGko(wj6Du<FN^Y@L zfV;v)pxG`^L?o4F=9GX+!J-+Uux3pIW&I-Xu`=BtM{Wj<(}QQ=e}Pz_f!AC7iN(p8 znenBdE7d^-156+%zdW@FB!HMeC<4uALx%G~r<j1}o^El%XN@4^{yiXzG(g6KSBip< z^3elv4MD_f5CJ-0vPc)?LXM);^vvRt)FQ|MIAI`J&;(;qA;^?c5K#sqVnGrUKrDR_ z%N#_2k6BRyvB2wR%t66B1*Aj<BnGO(ia=wEMHL_}c-@j6hy_}nRAc~Rf!4eiffm~o zEeC}xsC8KcsymCoOL0s=N<imo7TJJU)*wO~M1ZQnB6Sc;5k!ERX+@eK7N~+M0(H2G zltJ7pAVb0Hdu&16dm!$85CL8R1zN8GISlk2NX!DH1T?D(xfDbc#03q67O8?*c_0G3 z1PHXow}=U(BN`+Ix@n^*AH<CZaeYAqXx~gx35Zn&BEajkz=x2Ag18|dA{Rt}mai0n z7I59-iBBy~PAo`G2`J4=zQqsYd8Af=2JR68{>dd^0q%In#T8%<S3GF$2|TV}v<Vda zx}b>22H6k^A~HZk8i)WdH$$vZas;Uh2T4SL2+$?SMNS|w&=sXcpxN#sUl7+1M1bxV zDM|#X^8yiBAR-k+<bw#%IjBXTGjEC<L0r(t5YlR^-ypG>AR-rJlsw3h?jSDc$d)3| za9B|wh^q(+$4n5*8$@`5h#(M=0wO>w(Tb*k3~&Q+L93}Cvt8g89cYRM(r^R!<-tuo zc!&NLdvR(B_%c>-GY;Iy12^|T<ExNX9jK=YY3YI6cc2w1QQVNaAG}#ViWAhF0W)v0 zg13l8aY1S*&{Zu_d<Zt^#z2@{a6xKv6eqZX1}o!*Gr_7ji$NDerv?Z56#0Ps-Uaeq z5r_aU<eLm)HGl{{kdF}rxJ$}m13Adf4m8JCtii;<z{14B2%5tKUGf4tiWU{~FflO+ zF!C`9F)=YhX(k><0Y(8P9;lcABS;1$0-;6NKr6)sz!$>sG4e3-K~A+|1Px7dfkk;3 z`Iv<mc^KIk*+4dfFtZFZ8zT!7hd2u(=niej-VgyMF(wW!9!8KD$W>xY0u}<X0;~d} z0$c)I0`&|qD96Rb!N<YF!NtK0hSEF^NU|_h^$aEg90FVdd;)4LjBHE-o&w?myaKKQ z^$cnP+yaFH^$ZdMz5;Fn>;h5(@&Y0P`~rdkq5|Rq1p>hW;R0R)^$ctRz5)sY-U2!T zY68jvasupZi~>#qWdf1l*1E2Mn1G9btN=fU0got;3I`{L9EU6i2TuTpI*%3y8;2a| z05dRVf}H3CI^NfSi9>;dlY^fFq>F`zg+rD@f`fy@m4k^#4Ya_GgGr{Ifr*7hhEax5 zfKi4~j!7nwuat|Ci%Ee|j8TJ;i&chMh*^wLh*^P|g;|Ih6dMMN3LIentBVN==?nQN zF@vu3fy4@k6k!BG5KDj=bU_anlK>OQEnFayNr{<7jDv}dor9T;or8&unS+UgQHYU^ F2>{t#4EX>6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2af38670a03bf8486c9e3826e39395b9220cde45 GIT binary patch literal 8098 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 ZK~t<8j694SAjrbP%poUG&!8os2mp2_t>*v$ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b1a92f5aedff3ad9fe1273e01198fb379a8fd1a GIT binary patch literal 26422 zcmZ?b<>g{vU|`Vf?~FN8$H4Fy#DQUF1_lNP1_p-WcYF*CDGX5zDU2yhIgGhXQA~^= zHggVh6mtq=3Udxi6bqPUjba7UY*B1rnmvj=g(Zq3g*A#Zl`V@ag;A0rg)N&YiW|;j z&t{6^f$&n;TA3snQaG|%qj*z!il(IUr7=eFrwXJoMhT`0r7=bcr}9OKq>4s~rLtv- zM@i(>rAk6nq)MeRfz+h3XGy0qMG2?MM2V#Gfz`<_kW1lQ$XIkLRUn0{nK4Qt&%>P| zg*%0(g&~C}Rlb=yN}-Z3RWVhenW34Hks+KRPmYBlRVkZm0%H*yBLfJ+bVf4daYZns z3Z(FY%!yV=;Y;CfVTe*r5l9hiVTe+3XGjrB5pH2f5eA#9>dufNk|Nr|kRqC@+RPlK z=FX5JmLlH5kRqPSo~7Q*9HrsTkRp*H*}{+_309%$&X6LNBHhA}A`Lb{D^)91yO}Xc z$DJWXCPlV|Aw@P-qnSBMH&ru5E=4XyK1HFKB~>#;F-0jwIYlK!v6(ehGetE;DMcwo zEkzZ~Q%})IQBKiJQ3vz1QZ!Puo0(HJQ*^+3bW?P|;(96iDf%e}DSBX@A(*F^VhH9L zr5LA}fc2Py%`!_d1&f=fXr%H^U@DSJvB+aeu}rZ7yTv+1BgF=++BU^5#XiLWEUJ*A zkRlHjbxd(gaRRfPQ=FkJmlPK$%M8T^SFju1Qe46Ixr6=Xk>cLWnyQwfoTAapl&Y5E znc@Yey;FR^v~P-Eihnb6s#;1wN?=L=m=%-~oDu?Ng{Fk1go9ZTDUm5rU{-WWOiC=6 z6_*m9k^p8UrX-~#gIOslsVQk-R(eWCN+y_<m6Dy317_u><fY_;Sp_KtDTQEGQA!b% zRh&``WtF6qq?CeX%Tmh0?yN|u1k+V1)nK|Nr8cDotfDTZ9xT$3(wNc&7HLjtNofVM z+EUt6I>4;Xl&+L+Fsmn}H>D5E>Q9-FG7-$0lrlMG3YaxDWm?K~Fl$E2%#>MR*6fry zDRaTBc`5UuCND@?n6d~gwm4-;%2F_ES;} V=3`Q&x&Iq^tsquTIrYStHJnvKGu+ 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/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 <http://github.com/ActiveState/appdirs> 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_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +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' +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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + 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 "<major>.<minor>". + 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/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # 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.sep.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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # 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/<AppName>". + """ + 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 + + +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 "<major>.<minor>". + 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/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> 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 + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + 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.sep.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 "<major>.<minor>". + 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/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\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\<ProfileName>\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")) + 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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + 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 "<major>.<minor>". + 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/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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 + + +#---- 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.5" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd096eb01abfe18834bf45c2a45c895c336ccb21 GIT binary patch literal 558 zcmZ?b<>g{vU|`Vf?~Ku7WMFs<;=nKy0|SEt0|P^`1p@;^3PTh_3S$&w3R4tQ3Ud^5 z3QG!W4ofa;6e}Y`3QG!G4qGmJ6g!yBp2LyL8O6!SkirqnpvhU4<eZqCk?NeES5lOp zqmY?fkY7}y;F(vFT9lTUoT|sg<(rtDs*qWtkeXOrsZf#+Q<7GcpR14z(whv`Tb@~x zkzZP(kdvR6u8^0Qn_66un4DUy$5qAcT9lcr;FDNXoS#=EkXn?P?2wtCSCpTet(RYv zUd3jhXK18n`jQdkSH@dB$S%@kyd{jxcT7nvC`m2SWW2?XES!^C<fqAXi#<L*B|kYn z{uWn!d}3)yMt)Iz{4LJ-_|)9Q%$)f6Tio&SWvNBQnfZC~@weE^ixLY8Qj3Z}L3xWk z5n^%?GXn#|EiS01a#D+mSQr=>Rx%XvFfc%fUuF6QMVV!ZC8_#liADNp`8g@6MaB9? z#`?x)W@hCUC6?yJdGRS0M!A+LmZm1grsW0(1_tQ``XTxSnFYF;dBr7(IXSu(2D#Z8 z*+w}aK`@RlOU+BkFVaU2RQ>q)%)HE!_;|g7%3B;Zx%nxjIjMFa7Zrot!@>xLOgxM{ Fi~zvXr?vn9 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02202f258be88bf0c52e4806cc9f6d5392fc5523 GIT binary patch literal 1561 zcmZ?b<>g{vU|`Vf?~LJRWng#=;=nL70|SEt0|P^G1p@;^3PTEG4nq`(X3AmAWr|{A z1hJWOm~&a8Sio$S9M)X6C^j&gHHSTyBZ>peX3OEs<%;5BWJqC8;b>uq;!fdA;c8)s z;z{97;b~!r;!P1q;Z5OdVT|HS<xk<yW-2O4<!feOWJqBQX3!LT33890CgUxRqSV6D z)Z&t2O~zZo&WXtxsm}R%B}Mr;jwy)+C8<T4jJG&lGLuWdQksmn*mCmI)4{@gjz#IE zxv6<20f|M$sYS^k6G51ffq?<!OJ|TTl^7TpN*ER}mM~>8FJxq7C}CQ_vXG$`B*t39 z01`=I2xib^^wVT3Vr5`pxW!SNTH=#hmYQ>m9b{8xUivLo7gwiH_glQdB}J);xgLpm zDLJV{x405hQlM;2##`(e5aE>!MZ63Q48Mx>3yLz!5=&C`%My$9)ADmtQj3c9jg0k; z&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf|5_58NEevwAGqR0x zK!RW#UzVDel3%2s3<{`ZNI>bwC+DW<6;$5hElw>dEr^FYn+N25HgJIOFmf;!@iQ<m zz{7}%fq?-e2M!}Ua2S;^HZ!C!rhwv~sh6b|6jIC!8EP487#FalFxN0FWMX6hvss{Q zhAh?^#(1_GP<*obg=jM0;s!e_KD8t<z4#VaacWU!VoqjNYSAsujMUPi%;J*F<SO=z zl9B=|ef=s95Tn>iUtg2G2ozmKEDQ_`MIeXWVh>I&F3!x)yTzKDUz%5Piwo*gP_PR? z>_CWUGTmZNgrt>QEXAqC#o!2l5PYB*<xWp6i3dq!=I0540tF<>z{tcXz{J7G!^p$L z!B`}T95|o^1ab^GaAd%N)67uIP{WYLn8KLCl)~H#3JQh=ObbCthsEy}b7@gdl|)EJ zszPXxk3vblLP=4jLSkNu0@$sZjJH@aQgaG4nTtR{ev2nDB_%!)ns#q-6@XGNh!4sE zY+zmy#Py(rR0MMDEe?<u5{uG{<v{KSnZm%x#>mH5BoA^o$i1L=28ANr-63#ygCZ6j zjZ8HRpiEH9RKfzvh&7B^tP9v`n6lVwn6fw^(VNA(fD<ILkg>?4ge!%ynURqpkE4Vu zg$cw0XBB3@Dt2&YOi`@j^~*1Tcrr!7N<)(y>>hAn-eOKqEh&-$MJXuZ6^Vgjf)5-X z@kOb{1^Ic!skhjndH)u3QDXTmh-^wcOpvvpC^N4_llc}4$mc~8AQM<XdeK9NB{wlM zPX!b*0-#`EWMgDw=3!=I7GmaO<YFq)0BPiij|ZuWj|XLSfg%o&7<WNtfgUtRffHVo z0+NUx*s;)brUy-7;FKCAhf^6?4>%=9DdScI$+tPFMbIKAu_zr9@1U3kXH;+)LP8Vf y{Jg~6)cANLzau3No80`A(wtN~P)aBU1vLi~4-*eKaq}>9uyOEkuyKiSFaiLz*o&tC literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8480ed236631b5033d79c52ad5a8081666b5bc7 GIT binary patch literal 3044 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ff9f4bbf590e38623e2916a17659454ed30394d GIT binary patch literal 1774 zcmZ?b<>g{vU|`Vf?~GApW?*;>;=nKq0|SEt0|P^`2?GN|3PTh_3S$aW4r4A;6cZzZ zJ3|U{3QG$^3QH<;GjkM+J3|U<3R??93R@~mGjkMc3VSevCP!5gS4c*xLULkqMyf)7 zQdVkmiGpK*r$SnOkwRu}K~8FJYF<fZUOGfYv7Q1*bxLYlVrfo^LT0f-qC!bVQEFle zS8-xmszPR-Zf<IBeo>`DN@j9NW`15`QKcT&OOSgt8E>)p<R@n*gE%nE1oMCn0|P@U zLlk2QLlhIp6D<r;%n;{Cu|S*+a&QVq3qurJ3TH5bCf6-ar^Mn^XOO#-LB@cL1ksEP z3=GboFaZTy2}3hO6JrWPFoPzepC;oiVZZzmPnfS#Q(TLR@{2T?Zm|@n=A_+X&Q7gd z$xy`3z`*dUSihhsvn;VBRlh8;NIxw<CndG0Sl`H4-`LE|tlXl+(!4k?KE=W)*D}S@ z)Wq1d+`z!VAiY38M86=jKsPh5xFj(rN7uq2H#;NSC<i16#_?sTc`5lt`rzPB&d)0; z%Flst^a?6(F{h`NfLvV+@&^NB6))U}dg-Yp$;==xGB7ZJXnejb0woJg<|0-G28JRw z1_p*(tYwKgrKw<_K?n|zD06XY2`?z5Fs&<2Eg?EkA=WV=tb<qq3dSO^J!~ndIjJS7 z0!UT~AbbXqOa^%f<UbG%!r&+bc?24HU_&(-A+~_c1`}WlSd(+|i&KS>%;!g#50>-O zWWU7`AD@?)n;IW~iz_}pH$SB`2gK%yk1s4u%z?-hae{)38$|Gc2vF#NEk+_hHWq=R z0K_N;5gbe$%peFBMM>TuW#Ig&hn&2*QkYVhTNtC5Q&>`1TNt8PQrJ@1TNt8PQ#evM z!3mr(m_d{K7N<*QatSzr`=LYzD7wJGBgVkM07~IC4DpOLj0Jp|3^fe#Owa(+WG(_J zyv34}pPYS*B_**WQ4<nLw>UHNGE3q?ITX!bpfCc<#Y=($6BPUmj2w(rLU5Pp#m7Sw zptuO65bPp81_p*2hAf5!j5UlY3=5ec`Hraw6gS|&g*pM8EYU0n%gci71-ToP{1LXI zCx1>@CRc-6*e}KivY2rJQw?JcQzqj=Mn;Bkh7^WCh9HIr21Jkufua@Unp<q81u2Oo zsmS@H2$cEIT?I-F3Lsa3JP8gBUWB{Q^9d)+U7+#|6cGI~j0`o5H4Isd*=$8}AR6RC z!meX3$S=SbR-ojm0&*27e}i1b#aJbPa2F&~fyzAgB2b(Z@q_#g%7I0qAQs4-MIfIQ zfeb?OGCWfi2{JG+h=Xi^Bylbl4rUG(u&AFV+b#C^_>}zQ`1o6#km5fxFCCKH*dTQX dI4^)zV>A2~hYchH+JOSK7~}^QMjmDXegKW1Rxkhn literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9f948c43139e6f987c758bf5adbce8fc34ac20f GIT binary patch literal 765 zcmZ?b<>g{vU|`Vf?~K{b#K7<v#DQTB1_lNP1_p-WXABGsl>#XYDU3M`xr|Yaj11un zc?v8HsZ7~iMFxxvAPAOahR8-T<S|7sRPv-Sq%h^MM6rf5<jFu)M}gEbGJs`RqgbIT zL1r`Ou;sExv7?yX16R$Q!vT>+(!r9$nadT$g`#60Tn9@IH$)bygCmtEiZ`4gPlAOZ zl`osC=mA7!Dt{C&L`4cyFoP!ROOWq18E>(d7Ug8+XXg27GT!3x2nh)YN-ZwP&nr#^ z@iU9#(+c8~bMlK*Q#1u`@st+j<YXr46(klFrxr0WFfiQW_RKBFFDh{@D#|aq#Zg+6 z1D3nRo*a;woSl<;i>&}mN9h%07U;#7rRJsN7wHwH7M7+KmlW$2BqnDkrl%I`K@2w5 zD}q{H#LU3J5G8}G30+B)7P2gEBTGv%bBb6%#z`P+fEfppzQtaemzkWOl6s4?B(<U> zzNE4s^%kdJVs0wLU(CfNMJpMK_!t-<#IF+lf}+f_#FA9~vcw|&wEUcu)S_a2BV&DI zGc&VtixNxo;=K423!_}i6iZVRW7Bd20|SHf0{syEg3JQl%)H`~#GD*m3xnM3jBKME zkRTXC!$&_kF*zeOIX|zYC_hI(IX|}`u|%(+@)n0pZhlH>PO2RvD6y(BFfcGN3NZ39 a3NbS=@-Xr-^07ksOi-GciIIbmj}ZWxG|s93 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3220055144d48a80fce42d90d3239864ac4ee6a GIT binary patch literal 7644 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 J6BjcFCjebe73Kf{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..496da17ce2cc35ff89db4b9a5d7b41a323b97ac3 GIT binary patch literal 2162 zcmZ?b<>g{vU|`Vf?~HlM$-wX!#DQTJ1_lNP1_p*=1qKF&6owSW9EM!RC`LvGcZL+E z6y_F&6y{W>X67j76qaBHP1ctneVUB7*qtg%Qj0zPlR<nKW`>#N#K6Fi$`Hkv!Vtxj z!WhL2F)4~Ag(Zcxg&~SHg)N1>g&~S9g(HQtg&~SPg+GNmg{OrviX(+Lg|CGniZg{P zm_bwEmaubTPEJx{a<*G$PHK2jVnIP_QDPY*0|S?Wf`USDZemW3LODcOA+adGG%rOV zQ6a5BAwMZAHMvBgJR>tXL!mq~Cr6<qHB}+CEVZbzBqK8~U7;v7F-0LWuOwd~5o}aa zX<Axpk&Z%QUW!6_MrxiyNk(FcLRw}{szPS5LUK-iacYV}W(mZs)QZ&P(vnn#M1^Fi z^AyT6OEMHnGE%{YCFkdrq~?_rE99p^%z>D$#|4&k%*jzmEGa3<Oe!r&EmlY@N>wN* z%CE>wO;ISx2brNznwOGVlv4?EC)foL-$1p8WPlx%SX``7TAW&}keiyDlv-2_aY3R& zN`7flPAbHR;^h3IR0WOrcuj?z)Wj5!c?CtOX_*xY#rX<}#bDRu<(Gi0O-xSCOi9fv zNzBQqR4C3!Ovx`-NX$dHQxB{-85F~y*ap!|3=9m;pp+xQz`#(#(9BT75YJe{Si=y{ zRKrxm5YL>#5X_*-=%>k21X6lSG9F80#>Xd>rrnajE|perOAfmXEZjAjZ?P1o=A_+X zN-Ma<0TW%xPy|Zwzbf?$iZaU*OH%dA5{vZH@^eyBi;DG)jP;Gp%*@IyN-WKb^Wsx1 zjB+hgEKN;}P0I}o3=Gl>^h5LuG7EGw^NK;ip=)7~o1Kwulmik3<M^`Fyp;SR{p7^t zj8sru7v<;ZgCYu=67>oyZ*j!OXXa&=#K#MOLWm6%W{ez+Y>ZVhSOP&0rZ^cCP$0FS z@C9LT_=+$vFw`(CU`SzH$XLr%!dSyp!`RFe%%I8SSHud+*G#tr;^Wg(OW>(0KK>Rv zl&{HL#LmFLaEm1`F*mh{gMk4OHsAm%;s(iZ!}Z3;i-KGWDiRntxfrYDvAY#&a(sL; zBgm}`3=AL|WHi{hE({C|l{_^JSqxc>DGb>h!3-=6B}~~|MGA}zAQ;Jz#}vU($pKcu z441V7$uTlOWK$Ty-gDDr0s9c_?pu70uw3I>RFq$Iiw%-3H5tJ^g!l*)?+|bC#m8qB z$EOv<LsTh(d?o~PFC!Bp4-+3F8xs>F2Z&~=Qo`;}WbG(k1qBe;tDrIy<c%URQ2f*| zWHByaTF9`Fk&z(<lp7deIe@tclmd!C`fhQgr<Rl@=9H%5a5o#o!A2nWf^;!3vM~y< zS4m-YBiL_#*prP8IN4+|EMTkwC!89FET#p_HB2Dq)i5kzS;$bNQNyr+bs+;ILk%c7 zG5Tq;frI-N3#fR6IG44&D6=H>mJ;@Sh#W*kpu_`9Zp?|fCAU~o5=#=%;-yH8fq}sm z<T+4OF);El@-T8Raxhg%VDliz9oT&bs<S{r5BD8o3S%}?kwOhq3KN75X29ZO8x$Wi z`@IC^xMC2&%LVg2SA20|T53GVZg3bBiGy+tsFXwYVv!_BR0>3Zd;;+%C_@#=FfcH< zf_%saPHsGm0?aH-P+!Vn^CiMQP;toxDm*~BH9r0pSA2YKeoARhYJB`Hp7{8}(!?C7 z410WhN`7*Dd=U@G1)x%<2<}2~7=xVwaTS{TKm`jZDHem=$HB$I#KFqJ!y(AQ&Baj! llJnDKxy6*34=J_TAe9eT0-I^KIBXy;v;!3a;E?2D1^{#o7A^n) literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2e8853edad4a99694bd91abbb1fb57e8b79b4fb GIT binary patch literal 4682 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecc51c0005cd6875d4e72ff71025e9d5c6c5a0b5 GIT binary patch literal 4246 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 IuyC*d06<Qu;Q#;t literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c183704862c281e2bc7bd4a10377f79b776423b3 GIT binary patch literal 666 zcmZ?b<>g{vU|`Vf?~Iwx#K7<v#DQUU1_lNP1_p*=H3kNT6owSW9EM!RC`LvQn<<AW zmpO`=ks*aWg*An(g)xdHg*li(lj9{L$T-GZ!p@1w8L7_sc_l^pIgTlb1tqCPnvAzN zT{4qPz*2r8$sACdI2jliKx}7_WljtX3^j}e93>3R47H3kYy|=(jJ0evY&DEEOf}3k zEH$h(>?w@BY_%LU3=5c2m})o{GBGlM*~~C@FoPzGpC;=q?qrZ7;!{f!(~EC$6{i+u zCgx;Tr54@d%t$RQ$}BF)Oui+M3~^&lYEgW0PGWKKEkUrZ#H5_m_}tWzjQo`1D)x+$ zk^(Dz{VEO+qu5GcUz53rnSp_!h>3xL;TCIderaBbCg&}d;?&~eTdZIMidaDMtRR97 zM1X?x7H=XXC?Hl9fqZ?79V)hxp@@%xf#FxFenC-YSz<}5epzCXep-G`N@`KDzLBxM zv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_Nn%cpu7yEvc1E^Q z4oDD;<I7U>Qu2%R!H$D^TEDy~v7jKeNUxys77sXDpfLt=cCiE~ez>_9IT)FcAO{l< zBM(!N04Sc>{X+aeK$EqI7vx7!XcTdSSm3|`sR8>5iQoqX7>7-6eoARhsvRh`6oZuU LF!Hc6Fd`rTiM*r= literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..640ff5134d7723eed434c363e9d8732fb6425c03 GIT binary patch literal 302 zcmZ?b<>g{vU|`Vf?~Dm!U|@I*;=nKy0|SEt0|P^`3<Cp03PTEG4nr<u6eA;u&6LBG z%N)hb$dJMu%%I8gk`ZJG<1J3N%$!u`#N>=rO~zYXL8&R3#bBPFCd)0Zw9K5;_+*e| z5y<FU+(jUHs0cFy1H(#&A~psF2=S{{zo00yEU_e2zbvsxKP^8eCAFwn-^f_s*v!nV z+@i$Nyf`mD#lk4pGR4x=#Mrdlz`(#Dy+A)izaX<fH#4ueBrzvP*TNt-J0sgD2P6o_ z@nxxbDfvbEV0R?v=am%Y=Ri2c`tk9Zd6^~g@p=W7w>WHa^HWN5Qtd!KD+aljhY<kN C^igpD literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..955a4e53c783430ab7e17d5ffc829f5cd6a0e58f GIT binary patch literal 3236 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 Uco=z@m>4-2`Iz{aIWz@A0IwAE{r~^~ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a75c388249bec396ced498f9a136b51be2476386 GIT binary patch literal 1558 zcmZ?b<>g{vU|`Vf?~I9HW?*;>;=nKq0|SEt0|P^`1p@;^3PTEG4nr<u6eA;u&6LBG z%M`@~W;5q7=dwhxFfzC^q_Cv0wlJiyrm{3MN3o``1v6-}zXX}5$#{z+C9^EEI5R&F z%uXyxEy>JH)nvTI>6BQU>YSLIk(vxr3B$}V+wB+_7*ZLc7*iOcm{J&1m|7U3m{XWj zSXvmOSW@^>*izVA7^7HII8r!U7^2uxxKg-V7^2uycv5&<7@{~*Sc4ff`EPLrrKV&S zLu_G!S^=U#*cs$UP%zXm)-c2~q%Z_CXfpa~GTvfI&d<x!WV*#toSKtX#KyqDu#%yO zgMoqJSA%{*QD#|UNveKXVv&AYeojhiQL(;}vA(gHnOV6-iKTgQUVMs$QLbf*rKyRr zX}N)cfkAqKeu#cSW`S;IUU5lcPL8gHL2h<Nwowj95RBu?Qu9*si}aJhp^=|gQk0(q z;S}o^fjkfomeDJyyu}e8pP83g5+BbAay`f!42)I62w&>K<dea23=9k)8WgBt@A5D( zFw`()F)U!LVO+=v@h}tEi?^85Q%f|Nir5(#7;Z6Vr&fY}3?V>v6>&2#Fo3idgA8O~ ztl~qmG(EM%FBz0>KtT+mL4gLg&<127bFm1_(i*0POpFY9DmBa{ObeJ7GDtAgGK1w< zY8XpcYnT_XEo5kBtYKQn3`%1V2eLyQSe#l?1oFu(w$hU1y!`T8ti`D%sTH@FGxJJr z@s{M5B<92yrzYp;r4(zjfIU(Ka_}wIvc#Oy)LZPS6$P0^sl^aKf#S0W>@i*j1_pjm zXo7?o7+Dwvn0QdVSDadcJvaqGzJmuR!o|=aWlKrTNi9i*hAP-G=$4BxFffRLEQf}w zAX2D8bSE={0u>sOps)pps|o`HLxmhT<QNw+xG=;D)G~s3OrVHmWGLhbXGj4>FjJMM zM`}(%YLP-(evv|QPHJLNW?s5NVor`iNk*zdc4}p@LS~*qqC!eyNn%oBajKp|XmP4S zd1grlmjV<dCzh6E=I1H;X);5if(4|l2;_D=e!ImAwoMY`JCM5>m<1TC1d#j(mWF!| z<V_F;dk>@@>U?{!4u#U<)M5ot#!O8HxkaHMKR+ikFI`6=FJB=qH8n+{BwrypC%-rq z>@9>sJwI@eYcfI-1SpQd0^qm@IWfODRUYI-a0D=+IWWIC6;vj0g7RHnVs2`D{4K8d z_}u)I(i{+*CqBNgG%*JvQv@nYz}ch-l%&AHQv{0JB5?)=NC5(|8SDmd(qm;{U;t&f zVo*BeVB%orVCG`yVCG;e0?GJkvVm+%D=jH4N{x>%0=W>J0ixszG7I#erG_53Y)FQb j8W2tqDEPoeAXx~v^%jQ>!~=Gq;4TJbRURfDMjmDW54Bgu literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +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 pip._vendor.lockfile import LockFile + from pip._vendor.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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,367 @@ +""" +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 = cache or DictCache() + 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 + + # 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +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. + 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, encoding="utf-8") + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +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 = cache or DictCache() + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..ef71f3a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2018.11.29" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41c2a245f88a3cbca9cc74a91f84a671673872c8 GIT binary patch literal 265 zcmZ?b<>g{vU|`Vf?~E~FU|@I*;=nKy0|SEt0|P^`2m=E{3PTEG4nr<u6eA-;3R4tQ z3Ue@nCd*4kkY>hPtmPT0MX6O>Mh1o!dWMF2MwWh>%(qyQ^NUi8K*rqSj*l-(Eh^5; z&x?;=$xy_~zyKkB73vohWtJtDr0SO?7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p z<yxj#nwl7!mKzut7^D~Ihv*k%7U*W?6_+ID<mg%$<Ys4N8|8om!8pDwH7_N<NIyBX ns3bEjQ$IdFGcU6wK3=b&@)n0pZhlH>PO2Tq@x>tL@h|}ZvL!_Y literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4a660f40c6dda8af1b046875c1eb65c0825450e GIT binary patch literal 268 zcmZ?b<>g{vU|`Vf?~E~JU|@I*;=nKy0|SEt0|P^`6axc83PTEG4nr<u6eA-;DpM+B zGea{YBSQ*PFoP!ZOOOst##^lA8L367ewxg;gbOkY^y14>^HTDQ^paDHN;1<ji$Lbx zVl61j%qv;RP{hi>03m)A>K7DcmL-;?>X#)J>8IuAq@)%V>l+#C8=IM#m0OfpniuEA zr&t)}TBcZ<ni!jw8yFZEq!;Li=oe%b=w{{>mn7!o=vo-$W@ls@<$wgi7;3#f)O!8+ g_}s+Iy!d#%g34PQHo5sJr8%i~j3EDk9LB>408{x#7XSbN literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..582e15223d0c61e42ffb36a309b82c1325560746 GIT binary patch literal 526 zcmZ?b<>g{vU|`Vf?~GAkWMFs<;=nKy0|SEt0|P^`76SuA3PTh_3S$aW4r3H!3Udle z3qurBDsu{JHdB#WDoZL;Gea{YBSQ*PFoPyrRVY_-YEemMTBcq>C089BaB+oXWELyr z=BJeAq$(7pmXsFd6)Tivq$*_Q6_+ID<Rq44=I1Ho<R?QI`DqHti6E2o3Q}|RxL$%B z=9dg2L70(&fq{jAfx#K%L@5Rah7yJ>#sy3z%nKQ7A#9c!h7`tyASW^TRdFGV(qz5G zlwW*{r692+;}&~LW>H>ZZt5+L`1rKUoYeUETP#`mnR%Lww;0n_G8AzzFfjbe)h{T@ zEK4j&)h|md(of6JNl7g#);BWNH#RdfE4L`IG%wDJPq8q{wM?-zH8D0VH!v_TNH5S2 z(J#m>(1rR=*TNt-J0sgD2P6o_@nxxbDfvbEAU|fNW$GvA7p3YIRNi7O&qysw<pp^R z<U<BV9;PBtJb~Ppo0ypwAFs)Ji#<L*B|kYnz6cagaA}ZN;^S|z78GUXm4F?OL~t@N aFx=v>$puG%9f(&9@*WE#2Qvp72O|J7;f&`1 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..db68797 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4512 @@ + +# 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=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----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=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----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=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----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: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----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=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----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=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----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=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----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=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----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 - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----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=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----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=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----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=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=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----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=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----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=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----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----- diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..2d02ea4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +if __name__ == '__main__': + print(where()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## 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 .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __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: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ed6c3c57c9f169584339057447d0fe272fb2f2d GIT binary patch literal 852 zcmZ?b<>g{vU|`Vf?~D;=V_<j;;=nKy0|SEt0|P^`1p@;^3PTEG4nr<u6k{$^6cZze z&y>TQ%M!%`W;5ro=CVbx<+4YyGcu&Gq_DOyL~*3B1v6-}zhneiz;uf_Akqj#7;7@# z5)94DEK4maPRwyhElEu-$uH7my2TwI4-(7F&x?=0#UADw6zu8mmkiPkauLWitPBhc z&L9_gFfcHbFw`)VFg7z48-Q6%%}m7_CCn*|3s_26YZ#gt7cw?8HZkULlrVyLwG1U} z%?!1SHH-_`YZw+XGBVUKF5p<m5X_*-RJE8(K|w(Q;uM9Fj8uixyyX0p%)E4k{4_8> zJ+mw|Pa&zYBvqlfq$o2lU5^W_#i}5&C@~i-5no(VWCb!tAtWOeETT}HT3DKzmz=6l zlCO|jk(isAm#PQRR#I62QG?K>kdOc}zc?X5A-@R9Nh~T#tV~D%>!~tvttd!ME=f&M z$WO{jO)deu4Q5U;NE1juSc{HAdVYzOLbXAyCg&}#%;L<v;*!L?<kVZ7a3!}`LCoS? zoFSD3sjfvu`9-(b((;RP6H9KffLvF^!oa|AizO{JHRTp-a!!76swUGd4v-#@lW%dP zK;vyCLy;f@1H-RE{eq&*vc!^9{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV z%M?pf6JyhI0|Ntt^aA}5{esK_U9bala&#>Wa<enCjdDPOU>skTnwOGaq@SFTSd@}l zq8}fhnU`4-AFo$Xd5aC=1_@At5CA0+b}mLPMm9!1CJsh6MlQx8VFm^UKTXbCY{~h# z1&Jj^pd?hp4Dy#?DJ=a#%*Zc-_?I1;0E<8=t%!|*fdOm?*o#Pn5XcM;o80`A(wtN~ PkTu01wE~Phi~`I6GXCx1 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4db09b7e484b082bf3074620e0634742db2d81bd GIT binary patch literal 27187 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 W%}*)KNwouAR029Lm4Stsg&6?-iLGG( literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b4b103c764b38978751c560e20f839cc3a1ab9a GIT binary patch literal 1128 zcmZ?b<>g{vU|`Vf?~J+2#=!6x#DQTJ1_lNP1_p*=7X}7~6owSW9EM!RC`LvQn<<AW zmpO_V%x2DE$z_dV1+!Ul*mBvU*clnz8B$nN*jgA;*isprnWH#T*n=4~IbJe?EMvSS z=3AOmlIc`glIon1SQMOE5>S+%lv<?8cuUARKP59SJ-8&XB-J-DIU_SKRg>|Sgi~g^ zsY_;YNl|7}X-Q^&o?~8OPGxasu_og!UMEj?)A(TDcwc`PSD$2<>p?U#hyeM(gn@w} zl_82Tg&~Tmogs}eg)xPxg(HeNl_iBag{6g|nK6nrl?CGBX2vMCb_N!PD3FWUZ*hUF zhBz-7<a&^iAR1&g2p8)xFff!blrYvXG&3z=TFAi2P{Lfo(#%-H5YJk|*33}D5YJx2 zuz&+3lfn?ppvmZ`$$5*lxU?X(sECb$f#DWMe0*kJW=VW}5y-$IR*)EHGB_OKi*t)W z@o-Bt1<CjEi6HM+r54>{ElMp;EzxAW#ZsJ_lcvddi!(kxIVZ8WI6i(Q!>?lff}+f_ z#FA9~vcw|&wEUcu)S_a2BV&DIGc&VtixNxo;=K423!_}i6iZVRW7Bd20|SHf0{syE zg3JQl%)H`~#GD*m3xnM3jBKMEkRTYxm!;;V<QM5DXCxM-q?YI>Wu}`JfFn?^pt6XA zfq_986zCuZ10x?J7b6E_l`tY0^<dsb2~SX%I)k)<yqm%p%%I8ScZ&t2tB4PrXo`3k z7#P582*D2uCLWL*ic?GC^AdAYH9^{$KoP`LB@WUFi8eiCHH7VCcLpW8;#9CLnv7Vj z<;Y3QOD|1KPt`@T64{F|c})&b?1CH@AAgH0K0Y@;r8FlsKK>R@e0*VPVh%(G9A>vT z3X1XzQj1C|iv&SF6$bf_7aE<(sX00E@n9!`2~EZ#UXUVCAb=B*638K-)WpHa!^Xn` z76YX-{@f&}_aQM<1PY&9LXgx|49aD>kX!~%d$$BYijk8VB=xc7CM6da=Yo?a*l4gL ZkO+`FZgJQ^yk{o^attW?c^JWv82~d95^Vqg literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3836363eb5ef72987bd488c041d068c372a0ccd8 GIT binary patch literal 6314 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 JgQ1v!Bmiw|4oLt2 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20d4d04e498e5468bec38b98c78bc98b3702e891 GIT binary patch literal 2235 zcmZ?b<>g{vU|`Vf?~FOk$H4Fy#DQTJ1_lNP1_p*=9R>!56owSW9EM!RC`LvQn<<AW zmpO`=k-?oIg*k<#g&~C{mARQYiY0|Lm_d{6B_qgC##=lAMfpjYdFjC=i6yC;jJJ55 zGZKq}Q%gX?sYS^!n?N+kHV|DL#K6Fi$`Hkv!Vtxj!q?7_#+bsC!ra0c#SCV%q_DPd zM6sl@rm&^3w=gs_MzN)`rf{Tig4ygTTq)cw3{e~@JSn^_3{jlz3@i*$T)_;Q{I`Ul zmb(|_mli-=;Frt<vXg;<0Yo!1Fff2{u?7PJLkU9(V+}(yQx;PVV+vz0$lFXc4DrnA z3^fe#EGZz8HH9IVL6g}}lkpaJPGVkqd|GBsNovtckdc~fw^)ly3sQ@UKpwlr5g(tK zmst`Ye~UXlF}WnOEHyr_H1`&JK~a8EYEkhmq4=cK;*$9E($wPOc!;1T(=C?b)SR>; zR!CTK#>Xe;Bo-IP$FF4gRjpr8lv$QolB!>pSfrnppOcbWRIG1gtZ!^)W>#)dVrgES z7oTEblxvw{X=-9@T5e!qV31y*AEIB7S)iMlS6q^qlcQ^4kei*6ZIlBN1mpO!)V!4Z zBK_oy#G;hc5-?qyT9OV5F^H@53Mz{@7#J87K?wuIU|<wtWMgDwtdhnIUOkwvlR@bL z6fB@%1_cN>nEjA~c>&Wx21bSyMo<t}=+!V}vA8hAs?;*pFc!(wFhXUSY8c~LYZzD< zvY1nt%^8>&;+YF&!WqDk!3K^D7QZ4k1_p+ZB9Mie>_zMh3=EJMU@b~5PAw_o1POrB z{4F*}JQQ(*f|sd?hk=3N78}Hqnv6xfAa#5of*(W(FfcHvgS-r4Ffj5lvN7^7vM_Qm zvM~xVR!Ly-I@mh6zd_Cc`P~_0h5`cvLk&X~L$O2+!vaQ-zac!34?wIereFq5Mn6qv zu-k6&rKgs}C+Fv-Wu~O&C8yrv0mV*nYDs)vVs5G?BiQ9dV5fo!uzN)q7#Ivec7eRg zz{Cc2DGOtjJQkNC8%GTX7YT!ck^__@N)yv@xlojWfx!}s3$Z05m{IWD3Q9sC3=Yl) z1_p+T3Q)kgFvRB7GSx5@3l(zIFl8|oOM&PGOf`%P8Ectqn2WUvIck_on6p^2nTi~0 zK>3-qh9QeBm;o%xp3PLmk-}KR6we4wWE?3>7NA7NQNxhMk;0tKSj17noW)+l5YGwG zRmc$zib%F#22B<}H*lH*CqGTDB2c&&34#KGB`q~Ir3e)Hw>aGVL;YOhJwqT7%UTR7 z7H_fn`G>^&x`LDDEw*^Dpe74AT5oYARhFd27nc+j34xNK1c(5~GME5IwHN~fgCi&) zRX`aGoGh6b*%+A^xfof%Bq(=sF|sl8F>*0-Fmf?giDO9wAV<O@A5`Liat=6nXFyXc zC@+>UW-(<m6^W!U1~b$!mM~^9XEPNkr7#6Eq%hYqf%73tMNADt7OM+GY!Eoe?Fvn5 zn6uc5!)h3^*cWi5u+%VTaV}(HWB`dT;9AH~%L0{Q1<BMfXK~lCEM#G1s9~yM$z~`r zsbQ&Qs$m8dx`ig-;ASbFlENI!Py@;(Y<}tM+#gnntb1>tUM&J*w%DhG!U2S<cvXuP z^72a*AUVBCRJB+^wO9d>l@x3hREsrvion4NilHKLPykDU2vD(r6pL&*`RVDYMYmW} zQj<#4i$M7coX(3t=~$B$99v*>ZgGN3a*!q9IJ?CHW`g4jOn@T|ltn^8k){Q5C?gv< zvOp2W0xelUQ7FL3#K^%Y#>m0Q!U&2$7RD+?EK!GAJb(%gZcu##DjnkEZ*j%P=jNxB z=A_2Q-{OgnFDy;WfyjW1@gh)pc8jB+D8C@JsH76&FOZjtK*<X1!&|)2iYGZWCnr80 zQPRLlNw9}Nxe-*Z6@$uA4n{sU9xfgZ9u5u>aOvx($$E=5HLo<c7?Kfqp=A!FxGe(J d24Hmv!yzn?(YH8kARe%j0R<SyA|6H_W&n?q>FEFf literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a0b774d7e69576f1cd6da8b2e23bcc6cbd016db GIT binary patch literal 3445 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5832d72767081d537b6a106411180e7b68c99d7a GIT binary patch literal 2892 zcmZ?b<>g{vU|`Vf?~GyNV_<j;;=nKq0|SEt0|P^`1_J{_3PTEG4nq_}3R4Pm4r4A; z6cZzZJ3|Uf3Tq2P3TrBJGjkM63S%&XCfiGpe!rKDAY&PC@%SbtXJqE32A3q3q$Y!; zV3-+ZybA*ZLn=cQV+unQQwn1gGsub-hA0+@;Zdw9Y$@z53{h+;94VYF3{mVUTq)cw z3{f1ZoGCmhye$mPj8R-Ee8CKw{I`Uh^HVbO(!rKNEl!-q!oa|#prD}Os89@YghDRF zMG7VP3T3H9nQ4^@i3&-TC8-L<sfDGfdC92?Y57G8i3$aYMJ1WZr8$X33aNR?V1xA( z-13XShNUJZXFzn7WTYyjq?V*6m*f{I6s0DoW|pNE>nLQFD3oXB<S3-2rlu&AWF(eA zRp%?DmZcU|DkLVCWR|6Z%|dlnVp(ElPGV9{s*XZ_UMfUaVu?bcLP=(Bs-8kfMk<;= zk~0$X(o>5SGE0h)j7v%^PEAqB&jSf76cnYFW#*R_Lv<$Rft&<2JF^7tYOv`=sS1fj zsS3sjvx*fm^Ar-Hdf}l5@)Ag4ewspNUP)?EYH<lDNE7oE5=%?+bzwnb#RWDfIK(k1 z1Y(4hLP$ntu|j6C0x0Mpo-fG<$rXXZtRzE60UZ80sp*M15dRlLV+L##C@$exBU3L` zPa#pEEHNiDMIkvqB~_syKQpgH6C8=j8Hq)S$t9^p3K@yT3Q4J{c?y{+sd*)tX_=`h zdJvcSx`M1ONwrddx+^awGdZy&7393c5+pame2y>yJ>j4`4;<~8#R|m*smYmXnaQB= z0r?r^tm4!XP#VcBR!B)L&P>lsO#!<Y5;ch>m`0@*rGmmNFJB?QBqOy*p&-AwI5R0H z6`nX1$}=*PGZc~&^AwWv^GXsk^At)z0S!vq=*GbU6cpo`#gLR*lCO}HnwSD|WMZB| zW^Qh3N@ijSC_IZZL1|SXF|W8hwFu-)bmKstf<-tqSY3mH{DWX23yE-~fJINk$YGkN zkeP#sdvvQ5P_rpGh!NQnY!Nu$Ve<;6S$V1HiD-U<1RBCf7g*i~8=G2@oKu>T3RZ+^ z988x&T2X#3C>Dw{Q&Ni(OEUBGAVL|SSj^AU18YrYf|i9K8dMxQgGyTi1_p*2#u|or zh7=IV2qu|Q7-|^enM+s}u$Hhb1c|fPFf8C$$iT>u!Vt`$$>diAE^s+-vBl@+r=;fG z;)_o%Eh>r!MSgrield&>N_z1*sd=}!A@bntcZ)qIKRrD&FZ~v0dTNPJetLRp(JhYn z_`Jm2)cE*YY#`axqFby*sl}-!noPG?ic@paZZQ?-u4E_@U|?YQRjpr8lv$QolB!>p zSfrnppOcbWRIG1gtZ!^)W>#)dVrgES7oTEblxvw{X=-9@T5e!qV31y*AEIB7S)iMl zS6q^qlcQ^4kei*6ZIlBN1mpO!)V!4ZB7KmfQ&LOxA%!s5$<WNGS5OIZXl7n!NqoFH zDEN3lVamt`g*=Q^(wKFEUVJ=6M=~hTz#14B7(lTAjscJnB@9`hP-X&$E~B3&a}g+l zZn1*Pu_6v|<yOSUzyJvVa3~ZBg1Ed43=H-lhk%S@V62kBVm&w<;js^@XF-O8?alzj zK0_8m3Zo=L4WlGOEmI9c7Gnuh7IQXJkwFSm4MRLj4M?6@lA(r45|k=fK`OvvERqZ& z3^h#R47JQ)KC2`{4M-hBJYx+53qux53Y$3t6T}2iUCr)yi#s_dvA8(C1XSUGlh7?b zP-uga2t@D}4@5;;BB+A9#SIR9h*S~Ci<)djtRR1bf&?5!MZzF18;D>B1rrN6m~Js9 z-{Jx%MzC?WxWK6sY#1c)K<Nk^g15NxQY%X0!BS43fD{5n5HlYm4<j3+023dGWaMM4 zlEo6R2%RV~3yNiM=z?4Y3YlOAO-4UW#v-r-8Nm)jcZG0zY6&=tq~?{xgMuU{H7@|< z9FV6O7^~E<SdT>uiaS7B!R`Pxx<Kv##WFbe-eLjeHBClvSZZQ-kp$Rya61GNI`Pm< z5RBw3ZCuX6qK{a&apWZCrI#kAr{Z;AkvszfLm1pCOjt7>%p^Ze?jmjm28LT)@u2dm zGzV19@WjU#mL}$aLLxr?7JGbrN`7*Dd=V)Ai$K|`NE(!=WI%)*NH0f0QGP*cQAs7( zYNQB+r==oL-ckg)36xbiL|GU)I5?O&_&At3n89+ItVNt4qgYe(N^^_B>Gu{}eo|Iy eatT--o1wQjY;yBcN^?@}Ku#$JS;4`?!wdif01KD^ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6dd309bfc89570ccdd2151e1af6c25837510246 GIT binary patch literal 363 zcmZ?b<>g{vU|`Vf?~KV~VPJR+;=nKy0|SEt0|P@bh)7{bVa#EOVn}7kVoYJmW+>7~ zVUA)-VToc+Wl3dCV~S!+WsPFb6G>r-VoG6-Vov2qWdVz_M6stZ1~X`~z66=;r^)n^ znSp_!h>?MTA;e9S^A>Y)W$`VZvecsD%>2Cg%)GSxTg(BGMj*oY7ISe)(Jl7Uyv*eM zl+;@sNr}a&@gO12lGKWl_>#(k)LX1cl_jagD;bJ-K*oZIU-|k4MVV!ZC8_#liADNp z`8g@6MaB9?#`?x)W@hCUC6?yJdGRS0M!A+LmZm1grsW0(1_tQ``XTxSnFYF;dBr7( zIXSu(2D#Z8*+w}aK`@RlOU+BkFVauWNGwW8EzwWT&n-wS(JQFD#bJ}1pHiBWY9|H? XE+Ga61`cK}MixdEMh-?cCI}4x?tfrd literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ca014d2f15aca6d5c05016c77342465946b86ea GIT binary patch literal 1135 zcmZ?b<>g{vU|`Vf?~Ji$XJB{?;=nKq0|SEt0|P^`3j+f~3PTEG4nr<u6eA;u&6LBG z%N)fFW;5ro<g!Mwg4rxNY`N@F?2HWV3@NNBY%L5aY^kix%uyUE?7<A094{F`mNDLv zbPaX(4syvXE-A`PDlN&(&vVR6%&9ESEY@VaCFGo+l9`ttT#{Il>YJFHk(rmO$#_f5 zw=}0D)2Xr~)j1=vC^)qwpeR2nwMdik7N2u~rHN&Huy4Gtzl*C+GR*xTni)iZ{9wYs zz>vxi#hAhn#njG_#+bsG!qmbM#hl8L!kog=!qChZ#hS_jadR_c6k9t33qush&Fr_h z!RAA(O9puWWG09P84kk5It&a9B@88uH4M#63z!x%Ffx=dm#{Q5)-c4gmasK5)G)-e z*Dx&L0Li2<1T$zd`e}0BVl6H$NG&R2V_;yo#StH$nU`4-A72DAu!t2T#+eKbhxp>$ zA|?=DGzBTV;uApuR+U<Gi?t}VIJHER@fJ&QYEGIa<1Nnk_~e|#;^O%Dl?=a1^b3kI z%Mwdc^~(~A^waWlQc{bG^^J`6jm^x=$}LJP&5QHmQ!I>fEmJH_O^i*;4Gatn(hKxM z^b0ZzbTjjcOA>Q(bS(^Wvoo@dazKJ$9AB22my%zkpPZ3cl#*JapIl&RVp#x=5xs)S zA`S)y24zsNgBT2qe2iSo9E?>WNCBw_^Ds(?f<o09qz{z#QW%37G@1Nvv4XV~@qv?0 z5f1|c1DFjV_(37V19C=jYDs)vVs5H7NIxjR7?`Rgz*-?ur-!VFu&r#~`9-OTd0<;K z8L?W+k&~F0UYeMms*hwPiYH+TG&w*q402t3{4K8d_}u)I(wx-z_**>j@r9*{IS?6e zu-)P)D9SHLEh?!j5(Ifw800}-Xp|<W=H$f3gWUusG#QI{L5e`308U6sAeVqr6bB;@ z2M-Ha43yRcK%PfVKaeCP1W97Wpsbb)$!g#Pc#A(b38bSqwFDBWMW6_|#g?0tTwI(B fPM%<+!Hz&8K<>E3VFU4=oean^pcKHv2!_l6b)ONl literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..005139eb82971280baba90d6b4e0c91bed52ffc0 GIT binary patch literal 2626 zcmZ?b<>g{vU|`Vf?~JKsV_<j;;=nKq0|SEt0|P^G1_J{_3PTiwJ3|U%3R4S13R5a$ zGjkM^J3|U{3QG$^3JaLe?9PzFn!?t?kirJ$v$!*)u%~deFr;vR`K;~?DV!->Eet7K zU_P5WLkf2aPYXi|517xM!W+z>$yZgx<(QMBke{Ydl98(5npc`ztWc7XSfY?vl&Vl# zoSLFgl2Mdjnx2tgS^`#*oRL_Rl3JorkeHmEn4YS~#buRPT9T1pWToJen5W>Blb8oq zqM(tIn5UNn<2t10CT8a7CFkdAawWt345Arf{+3~2U`S<%VoYI(VoG6*VoqU-Vo70+ zVohO*VoPBSX3%82#pRh-P+AgPl30>j70jiepr8<vky)&enpc{uP?TCwlv<pcR|0Z> zszOR;T3TvRYF>##F-Uo_LZU)xUS?TpQE_69LP}~$YH~?_kwS7}o<dTpLS~*G*tC}* z2fYNj=p_>a1B0I?`z?<6_`Jm2)cE*YT=DU_`6;D2AU02Yd|_!~4pfFcK0YNs8Kfj2 zG{`mHG1%GD^A@LTurrM5;py%X?-Uv0x{{%Yhk*e?{L0fWD9S8LEJ@WbODxh)%g;$k zEh^SGGS)XXGczl<D6upz&Wlg6Fv_(|u{1R?HZ3<WFfd3j&=1is$Sly!%quQQ%*oNU zFv!i$$TrFW34(EaS!!NNevv*n7E(*}L7`KuS5R35@)rjvg@FhTW)?;e1dF0X2*~H) zglK~|LZaAH*rGU6*rPa8SyEY@7^1jRxl-Aj7*g4t7^1jSID#28IdAd#B<7`;CZ?yl zW#*Km7FA_|gPDj(%Yo`sNCRsuRwz#eM^<7%K~AMYNxniN*rbGnP*|k8K;twa0TP!* z%%Fe<<*Jup0_5qJ0t^fcFXh2e%TvS(Qosfx*g*tH!7U+Y4^KbWVAuFyPu~C^Pd86j zms`Rxv5+7~7tat+e?Lc`TO3}F0gfP*x7fV>gIpc`Zn69M`^7tZdEa7o^zpgH4%Kvv z+1bk*5$O;XFUUSV1_lN}P;>|}FfeeifFc8dIT(vT@+c7lia&6~5Rp@O0*dmJGV{_Q zdBq(ZSVROnJg*cK<tL?L<c}gy+CT)XpC&ujK;(3B4RLi2@$_@Q#o^{3>gN*g8FGuw z&p#yI*A)@~@Jvty4hm@o1_lLCP=Mk9o-#qA<OhInVsb`iUMeI2{74P}a7ZZRLJR>X zJ*0Ai$Z%i{4si?$xy9-l6yzUti_J467*_y*lB6a^0DweM0sxex!6`t8K-Ns<NMTE1 zZ((R=jN*i5MWNu-!qU{d<W!%`?9`mhjQsqRstEkSk^@%>svi;+KqX3Ia!G2DLRx-K zPJVf2UOKo+C@4xT%giq=R>;pwg=Rj~gz^&P@MKW>1r@L$8ibue9tP#j6vki%O{OX< ztD@AB(xSX#D}|7ZRE50KTu>6sPg6j0M{;6GYI=TAW@@oQW**pbQ1PZ$#1G0*pj4&F zc#AnXrx+=jfl}Blq4d;}_`K5Gc!UAgAnQTyWMHmR#S9!hOdWojTv*dPho7svV~A&% z>n)B@KOawTSD(mRY*3mbz(3d%EXSRklUQ7wn_7~QpHid-b1#}hi<B7{7>qzJ19=9P z6<8Qqn7}e9sR0y*;MAZ(AT>Y=>R<*<j$4Ax8Hq*UICO@DWM$P3{D}Zjks^Xl0bV@k z=BK3Q6f30V7lBPlNC?i%OV3Glsw_zb*;Jfb0xF17ixLtP3Q9{9;3)_ceI@yNTwq;} zd6gv@pv07uS`4ba6Y~_D{ry6M{CyNMixrad^NKT5Qj1bk6cQD3QcFrwiy(>Y<$q9V z{tra_1rdKh#BXrn&WSaiI79thT-`kVTwQK)`FQ%d#ybVMI(pw?3y$=4^7pyL>f-6{ z8FGsqYBy5MfZ_sDQh_p_BRqQ85CwJ-NXAc-qX<-l-D1m6%1TWx0avczg1iV+m=%FC iG&ml?s<Byci^B%e$gl&|PQ@ULS(pVl1^5LxK_mbtuz@%L literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1890982579f771bf00190455b94a55f0313bb849 GIT binary patch literal 2613 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 N6AvQ~qX?q}3jiKCb;$q# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6913c1a626ffd06193f44db023dd6af88cb3cd4 GIT binary patch literal 7074 zcmZ?b<>g{vU|`Vf?~LKoWMFs<;=r&60|SEt0|P_x4Q2+06owSW9EM!RC`Lwx6s9Pq zRK_gkRK_fp6cCAwSwNy#Fl#Df7B&o14>ltO%u4~OV@Y8HnUcbq!U`3I$g!lbpz@*S zg7rgP1!t!jM6so?N3o|erLd*4rLw1Rq;RHi&0&k;Na2p+1gQqQA7nCI4@eXVgX9Qd zkb4PXxET=FgZzesLAv28K;kK^5dVYN1TcnP9O_}}nA04hxKencxKlY(cvHDjxl{O{ zp~92GAH@suJHb!^g%*l?ao7n`1G1MG3{nfmkobq0h&8+*sRLvxNC%7tv9V#0JP0Gp zq4SaDU~HHgkZ+mOJfiqg1fuv;c~b;a`BM2)gi?gTX-ObOBuWrxsKLxar$J_8!*F%j z{S68g)bIg`AYqW1VE2Mt1j1<=Q9>!~QNpQ$DQu}islq9uDPmxEi=>DLGiXY@WCRre zjJJ4v6O%JC^HPIL5=&Aw7#JBCia;_iLB&B4GXn#|fDs^P44CBu>hlp{`AZg9;(E!- zz`*d53C0Ddzfl635k~`p-U0Cvoc+M56Pz&FKm{cm{*tJQ%OgtH-AUKT*wE+}yECXj zEl$;ByTzTHlUQ6FUy_)VlX{B>!bwX^F3B&t#a#?4aiLOt$r*`7@j0n^P(DjuVs7d! zj-152^wPw1Xt@k>2!3bKMV30{GCMrGgM)hj2yhG!fW1T3N^trcB^ZiE!(br7K$DZC z;_W3T0|P@9w`Z`wu91O}k*>2Jq;(69Jc{!m*c329rctDnqA#%(me|C|bPGw^IN$|0 zya0WP5JNLc0HhdHi;@&|!&)&o(ToxUQG$#X+zbqwT%_l&m!Q!?q@vU-;1-8hVnJeF zYVi<mn&K=#;pH0XAw?w}qa`MZ!%m~+>1cThYHAEnIzTELy@PJCdFL0UCg%BRir!*P z%`43<E&`2h-D2~Iig)%2zQr0G;usWii`6wK$Uo>7n`cOHyszsmR*$Io;E-E_AVnUI zLGeDWe(@oWPCl-;xIr?$@xJ~pu0FSTJ%jy0%~@wZuvt6^Zg9vg2?Wm>)eIqoOfb4p zUI8dZc?E#n0W%6DiQOoWI&`DFgHVj}4nj5xB#GT9kUFSQD;bKkKoJQde&y*G6lInr zmZa*JB^K$Y<>#cN78UCo8S5LHnVFSalvtV<=f$U380A`~Selv`o0c0G7#O4%=!fVR zWESXV<`tJD=H%#F802PWWE<sx1i?7IEHy7Bzepc6=8}?HqMurvT%4;{P<e~PCO1E& zG$++g1~mUw!N9=4!_1;A$Ed(4$0)`q#;C;1!o<V~gB(yfkgNiu45I?03J!UYEXWjG LD&!dD(DVWT@B@o% literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba25442d5eeb7bbf42bb067612df95c92e5504c9 GIT binary patch literal 2421 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 W#bE;p5j#-5Q4Dgh03#0!G6MjQBur8O literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7fbe50dcf48cd8c54afa490b7d993fa9a0935f0 GIT binary patch literal 12071 zcmZ?b<>g{vU|`Vf?~Hk6!octt#DQT(1_lNP1_p*=0R{$!6ox2<6vimV6s9Pq6y{(C zO_p?sIthnN15O484G{5?mw|!dWfO>~U|?X#EMa9}$b87iz>v9}je#L^2Z-<haTA#s z7+zihDcK1UJIutukU0S)p$#H-u`w{b3<t@Uf(+OV;%0!j5+HT4EDQ{pn?b}LklxQA z)>@Fn7ZB?Y$bh{diG3hqKZrO0BFaEUm4k?bAnqX$aTsKBFUaIvkO6KWy^0`H3P7wQ zASK)&)(b`khL<8Bbw@#BUqMQafmj=v85lAvK!zR%8Kn<W(g70t22yeYq~s)sU}a`t zc=-b)dkVyz2{P0YL<oTtuLZGAgA6DEDY*?2(*+TgAd^>v!pa*Yv4w?!;pIdS>kP=0 zvmoLeh&T_@3yP&oe~`A>AkXB1h$A540!Yb45OE1a90Ms41`!4zZ#9C<y9_eG2E;M} zxwIO@S_0C01*GFDh`0tKu7ik7ki-oTs|dup31Zy>5w}6a9T3qAlDG?E-2)N#LBs<P z@eo8j0ud1)7es)3{uso40wSJ*h-V<TM1ou}5hS|^M5uujcY=rj5b+$O?gfZ=2_iOu z#I}M${3yuYS0J%C5cf66sE;6{-hjm3f{1q@;yXz8J&0uq((wVrdJZz>BZ&10M0^Gj zUqD14$OZ2~>XbkcAOkY51QaR%K&-DIJ2rw?T_6MaK#F5QL^X(O4zlPQNQp2=$#;-> z)gaj)AeJ?V^%KM@1sVSdL{x#|Tpz^x1(K)%S#%ntcN@s4-ypGLAX#$|@dw0R4zfrO zMEnJD|AC0@AjSVcN(4Z}e~=ghJ17r=Bp5*~CJ@04B3M8KD~PBDS<VJxv4aRvkX~hw zjvA0eEr@6VaqB>=6(B21K!gQIj02=29^@lV5Q_^$aDxaQ5Wx!~6hVslKrDU`Apj!c zL3#y2tX2@~6v)b3AXDl=b_jtav_RZukls=dAq)~r04Y`iaoa#F5s+97h${+WiGhd) zkO7lH=81#25+EWGq*xNfk^&LZAVLO2$btwt5Md9pO&-Jw0_jx*5egu#KFIi$AYv!T z6h)Aj5{R$`DQN`R_75bh3=-P~QlbK4se%YK5TOntG(dzVh|mFPy96TCLE4hQIzWUL zNOmVkLL0<t0m<ruxTisc4oIvCWSb0#+YDlT0I}LZdeuO#4+U{|gSZz!dX+&06NqR5 zDb@uUpvTU@@KPO=uB1Q`tssdskY0U|Y%z#67bIZ-;vNNYr-BR>0f`BNSeHSB0*Lqz z60-!^mI^97qCtilg0yvjw5<aXVjv|^AjNGUi<W{|Rv;ZGL9*>2u?`Sn1kz><B5s2u z+(85bNL?pLRvKh{CCGRakdnI~QznCybb(||L1Jbg!W=~CfC{&AkmBPYb$dXj6oXh6 zAlV<FoO~W6YYF07fe0CpBlm*T)qxDP28pqQbl8Ac)*y*mkP=%E*A7J3gNS^PVoi|5 za}aAjNQVPRVmgTB2x2*bh&>=B*Fj2*Ktv>n>kN``0TCS_<845MD~Rg`BHTfQ2Z-<l z5vm|rFA&QcMEHORUl8F3BK$#w6v)#FAaB`$EDr#QeFNEM3(^}1;_d^nf<UZpkPCuA ztPl`k4dPw|5#6BR>;VzIAc6;EKqyE_ABY<UVugc<2oPZcl8pqVCMJ-*k|2AdKoZd) zVn4{X7!WHKq@*6CL>y#C97yaZNVXqjXgo+(2_zc;GH(iqXa*UT08(cSV)cQDI*?uu z5RnMd0cwI|mVvmxKoMF6GQb|Bjs;{u4@hDah)4pN@*8B^ERci^h)4#BrGQLH0clGG zannFVGRP<ckXR>3M+%5w1QF>V*-DV{tsq1HfW$IDVwoUQia|OIKoVIXF<X!w*&x<7 zkd7P>s~04D55%1S^0W<zl>`!-2;y!A74@MYQ+PlUpFk4wAXXR1C{GYK7i3Bvh{y*K zOduB&fLMhfq6kD3gNPCkQ3`UE9LT)GAOpHVM%@9KVg}-tfs~Ykh)E#JwLlUFKt7KJ z>8JonRDy`VAUh6%h$;{_3Z(8k$fdfVW}X#@*b35-1Tvl%WO6k~T@A?cW{`v$NUu6b zb~i}&1;_wX5HT5K?_LnA9z@uI)YXFY)`5s}km7m}D;>mY0I}ACOlbtM%s@JtKrB^| zY%_?}0<uyAWaTuF`^rG9Eg+UGh_xD|qZ~vufJ}J=$|>tW60IO@t{_$y$OSh*vQt1# z>jNon1DX5}Byk8t{09+DAS=^Ah0#rrwlI*oZjgjIh}90#(E%blK|~jbZ~{qmgDmm` z>F5E8MT5k8K`eEU-aZhkA4E(55feegHjqU<ph&p@(iRMI+9Z&~WDqe0L`(${hd~CU zf{1A#t^`P11<3fRAb(5)5l29>(?P81ASE+E#7qz|3q;HY5e%#h3@@jFEcypBU<OF> z9FW9Z5HSx#%m)z*K*T~2u?R$b23ceeGJY|LI}@Z$7{pxy;ueBrmx5SnAlL5$aWz1) znjqpRh*$=atpmxv1j)vLh~prl0YuCKnRge&dINHmCP*D4NURs6cR5He6Nvi?q=Xs7 zItG$h0g_k=B36Nj)u6Cf0r{;S6!A|$tdF3y@g2lE1~PdKNL>!dlw}}0)`Ga}Km-dY zT<SpTE`Zd%0uj!j*zW*|EdVJN1QBaMdL2NP&jvZ;CP>|SkO3P&#AT4ZMj#z+AQq^n zmFW%ACJs_p1tP*gTnUgVCqTx30OhUeAYuVXTOdfH2t=fT>|h1iQ4i7~0!kpQAay+; zbqXM(GC+hjNU<?U2{TBCA;`adASK)&v5g>CZ2}RSL4m^#G62-4%hUkr-3}tAgNR=s zq6(zr9>}~cARSvl#5NGI9YnN(WOsmAJ3+)Q5V0FX>;VybLB_uU*}D(Koda_Ceh}*b zh;RhC{s2hU24s8|$S5`t(Fby~FUazA5bGdFu@OkgaS-<qh<g}B903tWLBuf-aU4XP z01+oaL>S0`43G{skiD-!CVPQQIR%nE4I&Ic;c_430(MYLCxHTj14QfviFJW=TmtFf z02y!wq+>3Kbr$3;L6DM2P=x*hv6h2u69sW!fw&AHlOKVMN(6BgK@wUZ?s5?K9LRu^ zAl7-1p%*}eH^?Fv5Mco#L_n4Yfehsbah*V6wGE`h0VJ^nBry-<miZupA0+k#Bz6&G z)Mk*5N)T}g#Jvn6u7HTEAc75~E&`;(3dGtEBCdfXltE(GL9DGH)*}#+2@1a(Am_S+ zEMEY!?IlPe8$@gX5jR0PY(ci&0<ms`6i)^zz5`+@f>>KXvUfqU_dsG^pn!M)lDH4z z+Jd<ILELE|b^Ra*)q+fZ0Mfw%azPe|U<66Dfs{N1Njw4(k3qx}5b+d5JOdHWLBtCX z@e)M50uintZLdMBHz49Ih<FFGd^5=2ERd`}D9TJg+$$i~HxTPRNZkhz@exFP0ulWn zx10p&_zdE5f`X(B<lI;g(GQYv1}T{UBEEo>d<7BTK*U0j;t3!n-$C4bkd7Z9)=!XI z{(`KW2-3y{Quhlau?UnfCxIk#K#G$=gd>R92nvngASEY2I?jW{CV^P{LB{U@$!-M^ zVj$0ifDC8>aUXz)Y*1>N4+{1>AmSKEb~(s^KOpnIfDAAO5n3Sg7K2<+2vTwqr0o!h zWd}0lHAo37NXcK2wtpbvKZs!9U|`7921zi2SWF;-8APyv2v!aThL_eLQznASx&jc3 z4J1(kasfMtbsUskCV(U!gT%N&p}_%?5Cqw~5+wE+#Nq^r9RRVoKrC($@dG5w17h)l zh*Ka(Hh|1q3G(V!kfAvsr}2Sg`9Z`ykO50Tb_jsDf*|*4f)u|7DHZ~8=YqI@K-^rA zc@`i$rh{0bAi@R26$a_O3Sx<XSfU_;2V|%ih$RjpmV&qvAl5PvOA^GA0vT@(GT8?d zQBEM%a*!-P$W<;Nmr8@wodU6BK&%5GE5Cw>5|9#EkeD2ZkOvV8AVLvD@PbTH0<n}q zgbIjI1rb3Yy=owqI*8B!5t<-E3*?qvAQxzZxH_Qd-U8z4fVjFKLJy=Q7bJEX<RC7P zf8#)eK1enhWbz7-y{;hH`ylRQ5NjTYl?ZZfE{JOYQtS%SW(Z;#fe2#|!3Wa25=5*5 z5hft95RkelAZ_13rknw>OhFQ>K}z^R#8i;jSrB0ck}wAm0w9Szkk}d!Yb!`^K8R}p zlC=a8ZXoVjknB1Tu^vQNfh62P64oG=4T!J>5q2QL9z-~R2uBd%1R|V4gbRpp1raJB zi`+mgcMx$7WYl>Op$d}N0J38$C?E<zVjdtRo*=>tM0kS;9}sZ?<mtU2LJ*|m0Z8vg z5Nke&^#(-vg4Fqe2!9X}03rfGL=Y&B#6WSh5M)s>NK7BZ3IVYiL99>^>omv|4v-y; zAR-JTHVqW#o*=y*Al7pbO9-Un5J>SRkP8-q6o-QpZw7HAK(@^QsVfBeC=w(Q1tOwB zL=1>{3({KzlHCH*Q4C_mf+XTVL_CN{0GYxKGNlY;n-54wB1mi&NbCa0EqWl<R*(Tn zARTTXC3Ya<BFI4(K}xbfN|Hg^qCl)QAfwKK2q%ydGY~NyWO)KeECpmrDu|E*Nn8RM zPy^B?1hOLyB(V*|`U#RX1rg~Wv2`F;28h)OVr7DC^8ghOYe9OmKoVy_#?J>4*&yzA zkSRGJ)@6|8h9HSt5H}A*<b#L;5K#ysia>-j$mC)Ws{}-pf`~E@Q4S(rgJdf}tV$43 z1tO|J#14=}b3w8-AZ{&)r~?u8Aff?8>;x%k1i4up<Xj<;Vp))bnn1GtAl6NgSTl&* z3*xqbSgjzU4MebkywDC}b%2OnAjO>^Ru_nH1?lJpv3fv6A&A=xV#$Ld$`hpbJBSqn zlIR0T=z_#nfK2HJaf3m!yFiYd0OC#rxfC={kvR#(O$Di20n$4e#JvovKXO3+I0zE+ z1r?yupr}{_A_74Y?4Vc;0I}FWCQE|U#eoP8kiEPh^K?O6HxO$ENNfto<V7H^D2O{1 z#GM8rc7t4X3ncLiL`(;X%>WTILBuQ&u?M7NHi-2QWZN7NYc7c30@<MlGVd@*q6Ea6 z2a=c%A{Ky%86ZQwKoVy_N*02|7J-PxAYvv+VlT+}eIOzoq+|(5VkwAN1|pV&h!r4W zKS;?+5Nj2PSPdf9fQYpqVjYNB4<a^zh>aj(6NuOhA`XD`UIE#*1;pJ7BDR5u?I2<Y zh}a1tc7cf9AVL_VV-JY67Zh73K!Lpv#JvmhbSa3~58@sG5w}6Uv;?`H6GR*Yi5&tF zhd~4<NcI^>hYE;w1SED8L>vPV2SFBzfLbG_AUjk+(cKARWrNaz4=B#(fw;#(ibX++ z4}plQAoF@a#1D{_Vj$KDkntx#>KsAbT_EB+i1-hZcmX2Tf)rl`1;i{6aTsLONstGF zKo)HRSyT#=m<=M%f)t+unI{HPcN)af1etdR#5xNitU!jI1F_D7hzlU2gg~Yo0yR#~ zfmjzo5=tO#Dj=c^Wb!4D*ng0cMId{VLF%GF+$A8^eUPD-K}wE*>^%w!92Ss-7Dyr- zWQrWfY2F~Cu7K3}fLK>SmTQB|TMbey4${^Q;$8=FuYuHE2N7pMrm%wyxB=pFg7i9p zEWZI#cM~LL50bqFGH)tK>^4YD0_2uEAl6+Fu@7X*HBd%u2PyFd>4*k7%@jo311Wg| zV%-O^@<6ivps0NZQv43YJq9xG0mu$#kk~_zI(3kaM<CW?5OEg7eF9?L1F_bDw9Nsr zo`S@<Kn{NfVm${DFF*t*NcJU&B@1%jD-i27h<F1c-hzmCAS>NKR)&Dg(+8RI9whMr zM0^AhpFm1PK|yB$Quh}WIHe%g29WWeK}x=W2yYPg3dj@<kZr!8(3k>JCj-)v31W4E zl*|FyaUDc_2C4fBGJZEm_8Z6)F_6S@P-uJyaYH~let?wNgOrGa41ES-{RGMW0uhoR z#lJyDNr56c6(p+wb_R%e2QuI{NZlV0@fSq2gCzce3{?dwHUJsQ2l5~*i2ENT;SXXh z1{uo0$-t0l0WyUV#9{&w%pigVM6iO06CiupKsuyBZeat7v4aQ>P6mdTpqb{(YoIVt z2H7D2BA$X2bAps?2c?5cAh9rz7#Ap?^MhCdAV&s(T)+(yQvfOP1xbX1B#wXxE|3At zAg6JISYJV`8W6z);_`wl4+iPD3Nm0Oh_w-9o(#y5Cqcw15OEqr@PTyjgNQRAC1*fl z0wAs+h!6r1!XQEfM2Lcjvmhm6AeK1Dq6U!rEJ1_|$RbvdGbBI(dl@9Q3M6&|#FYoJ zBtSZhL9ERnb<aRnN`j1%0uj<6q8cP717dN2l$-z&vLLP;h>!;nD?wrkAl5lh1oVT< z`wbFf2NCN*A*2YB%?5F2fVk&D>KH)W3n16~fgJQ1q%9I;+eMI=5=e(Kh)@9$svtrQ zM5u!Z4G<9vGD;J~(gG3MAVLR3=z<765YY{?Lm$Mt1Tyq8$X+{;MdG07UIq%1hafI! zT|uTHNZlNe3l@X4-2}O+3nUu@5?cVW%?PAqE+}glgIHHUhF%2`CLpdUh%f^Y<sc>I zAl43$UJDSb8Dyw2h>!*8SOt=}1L9hOWUWAi4=8o=fLwJCM9cwMZVif~7a*1mNJ%3| zn+QnT1Q3fAL|g-zcO67<gX~=Zl6?S@xB(Kg1!?;Ua=jNw%nro02N4b+;wDImBgl?V zAUm8uV$LAK1w`Be$-07AM?nUh1R3B4;<|$f4-nxABA$RGu7Q-?2I<%UV%-6;-h)_P zASK=)LJlN$7ex4gxV|954@3xp)Oms&?hoPyfQWk_b%7vO5Qqo{5lcYoLO`thAlXn5 zD-1-0gNO(aaSId%kswwSh=>LeF(4uqL_7i+unk1Sfw=J?A^}7sf`|toL*+q45{R1& zB2qv^Du|E-nfw;y)ie+{9YlnJj5-Grs{qL=fb?d7B<6v*4?)~a5H|}H#Q#A-%mPw; zALLaN5K9e|60d<I9)T1;1`&!NVlF5#ya!3_0Vxg!5tSfAc|gPykdmh$LJ36hg2bMI zSjr$G8)W5k5Gx17$^{X5AQx-^nYSNg??;e%1t3-+h?oiThaN~QAEY=GWcgB%Vt<gy zFF-~WfFxdmScM=~5r`-T5fvb9B_P%wkWr-|RvCyW2N6slSq6~tDj>ZTAhG!%Ln}e7 z#~_IWkhUriw;Dv$fQVX<bMJy&PzU1HgNOzY(Fh`%KtwZ$XaNzeAjOA4ik(5WT?2*b z9uT(?Wc+myp$f9R5+vIKvP}x)f_#uf8_0koAc=Mms{=%If`~2<(G4PcK*S`F;$9G| z4@C5XhzTHKGDrecy<|=VabJNfS^zSB5{Nq)L@<LK1X|{lxf*2Adk`@NB;gKn%Ty5S zF-Ytwh~NY1H3I3l3i85hka=%F>Slq6X&}YZLBtFYF%v}ifwav6v3Njkc>*FnfQW-2 z9k)T|%?8QN0TFXS#5@o&9~5duAUhU-xNkwGRDl%dfnt9#Na791@`E6w0zeWALF$x2 z>K1`mY9QG_ki=pT_brH<3zA&|;wFPw+d+EofRro+iK&B>ECaF1K~7r^Vyyr<;}*y^ z4UlXONSgzQ_ySV$4kY#-L}-GD4<JGdM63kqT?HamgNQXC;wi|swIJ3y5V0OaYyc56 zK}IbEIb$P;I|ZcfBgm9ZAns-mu?0kUfYhx45nDmrZ6HDxq<A}sB@HrQ5s26U;_d_y zyFkPzkWsrqtUVy22;};`AQnGJ@nTR-;t2BKK9JZZQ0SfoanFO)EdeRn4+?`?keCk0 zwsw%jBoJW*;_e1HNDjp91L>U&QpXFDU<MJMAlU;Tll?%fpCEOHAVUv=#KJ)d=?kbj zxed}b6{O=Ah}Z!l+CVx!gIs?Iq*xooIt*eR0XfJJq~iuiT@uL9ry#{gL9&G))-e!E z2c+XTi1i!Py4eTPkqT1$6{O@f$hq+#F+PwfDInqmNbyM!aSBA71`%gK#95G)Z6L*8 zK!zHDys!*x6o}gd(t8f1WFbh&d613^AmSp3xC9~?K}s%zSl>W8u7FrqLBwp3DY_uB zYas3o5cfNXdmYRL5jR1^Ef8@VMBD)pH$mpz1+ngdi2ESo0f=}AA|8Q=KOkQ|2C?pf zocjdCdJ1x+Bq+qsfLv-0vh5j2;sc2F9K@0VDSiQBy#x`jK*Vbh@diY^1rhH+rW^+u zZ~$b-50Ks~AmST{I}t?u05xZhfGpAhsdEQ8_a4Y(0g$?PASLfXM*Rh`;y|(=K-`ZY zLJ#EqPar#5Kzh?bN|u6@d<Mzh0dc>8SYJWJHxRKDWb#jtw(lUWG{}zoATe1G5f9R_ z5M;m)knB$o@e4#O0ws&>AUiTZvKb(C0w5jLAmTSjNezhg2PC@_lwN*<6dQxZK(c>9 z#6J*m31sDSkOBWeTm~)%hD=5-28Ne0ARSB~iB%vaOF#r4h|2_0!VDr<Km;p@U;`2C zAc6y=cPB_MCy2`hBDg^W4~XCZIp`P2zmq^lf!45QW`Rux$!3CBvp`BrKrWR8vG_p} z0w6*VL<oThVGtn#B7TEn>o>?YQ4m)QM2Le32@vrIBx?qeO#x-tw;+~2$Z|=LtQ3e4 z23a`+M6`pH<b#w*gCzcf)CGZ@aS;@L%pi$VAQmSmZK#2`G9a&JgSdGhZWSm}E`qpH zAnrqu2S0&KmIayj4`iMkh_xPM$|;b#2#~t}Ac+)^I(ZNg46<?xNN+8OB@fb33zA>} ztpvOU3X(dI#9olt0}!hoM4SUjD1a0zf(SnlR|&-02U52a<g^_i+a7`xKLQcgL3SvE zl*|Un9t6o2gS4rD#8g3q8pwlbAPE<cDbgSvh9D*CAlaoLF+q?~8X&F%NJ0~&BM#)Z z^&sLXNbfX|IxUcr(;${Mh@}G}bU}n3h|mWSUSL^}9R?t-A&4*n5r;rxAs~xdK}w84 zVkRKM6hxSTtb7Tw$Q;CV1UW+wq+>CNwF^W%2I;i`$y$O4Mo>s9fs|N*xYi)zBS@VM zh-C{R>_7w)NZlroIs;G~*@MJ(gVZ^ISj-?<M-a;iM6iG)oIxxX5a9|U+(3joh?oPC z?Eo1S4`M}wSRNn=PY|&TB*p?VF9F0#1QA{!i6)RbA&~3mfmq8xEN_s64~Xyu5q=== zuK;=9AH?kesmlZzAO~W}fpoBfOb!6a27-tnE(QiaP3Bt)uA$D}LGdAx0iMo|KJhM| z!68AOPN5;5{(kX6jv=1@w*;Un9G!ez<AXh;TyIH0M4UYwgW^N{<K2Q>1LOUJTwH@z zG8BQj#bDxBk$yo@W?5oMs(x8wk$zf!PD*M~vA&V9zOk8^S-C}trFn5)e2Rrpu4Rg) zsfn>^xq*R!L3)9Hh<-t4fo^7AaY<rMj;@74ZgxhtQ4UBDjN{8v^HTDQ^pi6Zi&9cc m^ixZdvy0M-QVaD8DsOSv<mRW8=A_zzrv5-v6bvj(EGz&O3RMXJ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..734db72457b1c886b52f06948c033a850bd1c553 GIT binary patch literal 1136 zcmZ?b<>g{vU|`Vf?~J*^#=!6x#DQTJ1_lNP1_p*=7X}7~6owSW9EM!RC`LvQn<<AW zmpO_V%x2DE$z_dV1+!Ul*mBvU*clnz8B$nN*jgA;*isprnWH#T*n=4~IbJe?EMvSS z=3AOmlIc`glIon1SQMOE5>S+%lv<?8cuUARKP59SJ-8&XB-J-DIU_SKRg>|Sq-&_N zcaTeFaY<2TQfWzMex74qVoqgoX0ayYEk3Yhe6Vl4ufL0{PcqE?AetFOfc#*>z`&5o z5XG3n5XIEakj9w8n8MV;5yhO!lER$A(!$Wp7{!{(0&#OQV-#CE0}DeG$j$7xxWVQ_ zT$l{<0LV-b4Kf^ri**<n7)lsQ7;6}snHDfDWME_{VJ=~5W~^a|XDwlCW~gC^XRl#c zzyXp;VF+f>Wc1VIyv15vT98^)#KyqDaEl{8J~J<~BtE_fWMC01NQ^TX92D`zxkaF; zxFwo`<p20YPyke=7TsbkN-a(;(PX^EQk<HTrpb7VGd?~!C$YFVK7J*`uM+)&qRg_y zl2rYKE){G623qGEj`V|`;YGqZAw5=-;qy!aFgqg=}rOH&hL({cj?1B3Je{Sf_v z%mUrayyB9?oE%*XgWT+lY@-~IAQ;D&rRJsN7wIQwBo?KlmguLJCTABFfFn__pt6XA zfq_986zm`d10x?J7b6E_l?YNm>cKpW5~83`bq47Jc{qhJm_d`tuZqnz)LGX%sE7}o zc8Yiy7#P582*D2uDjtwKic?GC^AdAYH9-b2fg*{iN&?wRWJLt6y~XC8UzD1d2ew6% z5v#QvIf;4crHSdOx=2={_!6c-lLHjRAlJpm-{Ojo&&^LM%}I@qzr_<DUs#%$1CarT z+bxcQqWpr?qLRuY0gzXPKpy0U#%XeDPELG0*iB$Uld*^wqzDuW;FP2UatSC&aWL|* z@vwl!K#7e%Hwo%}NGuhB0_c_yB#9M+a$7DWw}BJjEdh{X<n#tff^4}-$;HLF;PeSL c8te!p0_2Wc95xW|*~x$$14;rsj9|zN0PVOGFaQ7m literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25ccf99f19cf87aa77b47f394c1e31fa21abe218 GIT binary patch literal 27191 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf8aa6bd3b1fe5e75f66b4f9245d665cdc03ebaa GIT binary patch literal 1136 zcmZ?b<>g{vU|`Vf?~J+3#=!6x#DQTJ1_lNP1_p*=7X}7~6owSW9EM!RC`LvQn<<AW zmpO_V%x2DE$z_dV1+!Ul*mBvU*clnz8B$nN*jgA;*isprnWH#T*n=4~IbJe?EMvSS z=3AOmlIc`glIon1SQMOE5>S+%lv<?8cuUARKP59SJ-8&XB-J-DIU_SKRg>|Sq-&^i zNVrR8aY<2TQfWzMex74qVoqgoX0ayYEk3Yhe6Vl4ufL0{PcqE?AetFOfc#*>z`&5o z5XG3n5XIEakj9w8n8MV;5yhO!lER$A(!$Wp7{!{(0&#OQV-#CE0}DeG$j$7xxWVQ_ zT$l{<0LV-b4Kf^ri**<n7)lsQ7;6}snHDfDWME_{VJ=~5W~^a|XDwlCW~gC^XRl#c zzyXp;VF+f>Wc1VIyv15vT98^)#KyqDaEl{8J~J<~BtE_fWMC01NQ^TX92D`zxkaF; zxFwo`<p20YPyke=7TsbkN-a(;(PX^EQk<HTrpb7VGd?~!C$YFVK7J*`uM+)&qRg_y zl2rYKE){G623qGEj`V|`;YGqZAw5=-;qy!aFgqg=}rOH&hL({cj?1B3Je{Sf_v z%mUrayyB9?oE%*XgWT+lY@-~IAQ;D&rRJsN7wIQwBo?KlmguLJCYO{KfFn__pt6XA zfq_8@6zm`d10x?J7b6E_l?YNm>cKpW5~83`bq47Jc{qhJm_d`tuZqnz)LAzqyoe8+ zc8Yiy7#P582*D2uDjtwKic?GC^AdAYH9!V1fg*{iN&?wRWJLt6y~P%im|32f2ew6% z5v#QvIf;4crHSdOpaf71wGzdbFa??%peP2pE<XMiSA2YKeoARhYJB`Hp7{8}(!?By z3^?3waTFBg7o--IR2B(<yeb6pATKmdlT&kY;^V<?0u!2yMZ6$Ipils(Bt?+tK}m{( zk%x_k1uO<iZ2Y-NQ13%xsR-oSTSAZ|Rt(B*xscojPJp)rK#Gym8zc#`<t8N;7w3Z0 eC)jAPBajG?J8p5<K)h!s19A)~3Ggt2Ark=hQ52p4 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ae0e76fb745e8a891eb657c0cca57e51dea81bd GIT binary patch literal 19115 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 RQtd!<!Jw5-3@l76%mAj*g-HMa literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6a2c3d9fe99af1e8ec79958e29dabbb8acb05e0 GIT binary patch literal 1144 zcmZ?b<>g{vU|`Vf?~J*{#=!6x#DQTJ1_lNP1_p*=7X}7~6owSW9EM!RC`LvQn<<AW zmpO_V%x2DE$z_dV1+!Ul*mBvU*clnz8B$nN*jgA;*isprnWH#T*n=4~IbJe?EMvSS z=3AOmlIc`glIon1SQMOE5>S+%lv<?8cuUARKP59SJ-8&XB-J-DIU_SKRg>|Sl)ICW zv7wPmW^qYTW>RTMW`3SyUSdvVab~e5<1K!OY<#e9ysy8Dt4}h_2OydmM1Xu@!oa|g z$`Hkv!VtyO&XC5K!kEI;!V$%s%96sI!qURf%oxR*$^vn9Gh-B6I|B<t6v)-=w|F2H zKpdG2@&m|F5DhXNgo||;7#K<zN*HSxnwb_bEo5M1C}A#PX=bcph-WQfYi6inh-a^1 zSik|2Nnr?P&}8(}<h;dNTw0J?RK&)>z;KHrK0Y%qvm`#g2xMRpD@cqp85|n%#kobG z*tjK{f)oPriJ%~;N-es@T9jIxTB6B#i={X<Cry*_7H52Xa!z7#aeVwrhF_)n1x1-< zi6yD}Wr;=lY56%RsYS*5M#lQaW@cvP7A2PE#d+~57Dl<2DVC-t#-`;41_lP{1^OZS z1(^l9nR&$}i8(pC76!T58QDfTAVDyWFH6l!$uH7R&PXguNiES&PXa|z0XQP{3Mz{@ z7#J9oKmiY8Ffj5laxro+R*519r5?=7C}9c;S7(q$ke5>!gBdiL{BE&9^cC@e6HpNk z0|Nt?4I%hJfyD!INpWgPd|qO1ss_jaCQvjnRY^khLZVL(SruV>*_}a2us9WLk0v8l zi#c)<^U_Nb(^El-pcrZ?sz+feG&w-=402$6{4K8d_}u)I(wx-z_**>j@r9*{IS?6e z*xlkND9SHLEh?!j5(N2H801G@Xv8L`=H$f3gB=AXG#QI{L5e^D0ZvYeApe8X6$c{^ z8xIRu43y&dbCaL}0Eww0kaKSdLDE?<DA(meaveAo-Vy*QMox5)bjX&Qlw4e#3r?h9 cqrr|qB0%oA#bE>So}CQHF`#6?!w7~<02w9|B>(^b literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ffd72d52c492e45748a34e63ce70525becc7512 GIT binary patch literal 2978 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 Bs<i+B literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fed0d2f23aa14f2f53332d0418fc3cc8490d1c0 GIT binary patch literal 22143 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 aaMRyj!BVo;WB1X=kUWL^o#whtiZZUV`^1ewAH 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 P(7~vn@iYb&W)@}ux{}(O literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cae33380af7eb31e77c00c042828555592d061ef GIT binary patch literal 38022 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 O#h~=V5-Q*<APWFAXivNV literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f76d7f6ad34e9b51d2e3e2e81eae377371dd74a GIT binary patch literal 23636 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 TvIw(CveYxMFfqa)2ND|qiZH#+ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8b2cebed02d158261eca45d47e072cd94b77f91 GIT binary patch literal 29092 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 Mz{11`gB%pF0h`{e3jhEB literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..942ad2c06f9fbf8f763747c1122b07ed96abb701 GIT binary patch literal 23594 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 FYygBl9uNQk literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..388c9a9566eb3e00576bafa7f6eca019f31a66aa GIT binary patch literal 22223 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c27b043bec3da7d704e24e57abb4c5507ef38966 GIT binary patch literal 23625 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed2c199f867ac621a2051f09ad489714a567ce58 GIT binary patch literal 22202 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e80d33920786719f5f6ddf3c960d88a502fef21c GIT binary patch literal 22225 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa63b37c6770d278c8b57fe4be2914aed62224aa GIT binary patch literal 2935 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a269230947ac87fe1d7d7f426d7680d3ad08685 GIT binary patch literal 2240 zcmZ?b<>g{vU|`Vf?~DoMWng#=;=nKq0|SEt0|P^`0Rsa=3PTEG4nr<u6eA;u&6LBG z%N)g=%M!)H$l%V9!kog=!jQs}%Gk^t#hStz%%I8kk`ZJu<1Jq2jKreg)RKUr{G`+( zO{QBsAXa8xdT>c%N$M>g-^ApM%)C@EFBxVxhz8jYqKm^A7#LC+q8L*cqL@+`qnK0p z+Zoar!FF;+v4GjEDQqnqQLL$KDeNg6Eey?!QS7N~DV!->U^YhzcM4AnLlkEUZwg-v zLljp#0}DeGcQAvdz%4P~(wve^r^=F46n9oBa49G#C}5WaOZg=;fn3MHzyP9|85kHq zxLAjQfuV$<gt3O9nJJ5@hB1Y)7aU|Y4Drk<3^fe#EGbMWOzBKD4DqZf48aVV%zm1T zx43f>^U~wfGIL5&i(Z0^)nvQHT3lL?T2#c!z`$^eBR)PeFS8^*{+4J;W^qYTW>RTM zW`16LVqRiSWmRg?Ezacpl+3*J_~P7KT=6-H#U=5{8Hu3KW+_h1Nh@N5#06)3d~!}= zadCY7N`_w*`UORqWr-!J`elhl`f2$&DXB%p`bNh3#%5+_<rXED=EZsODHcY#mMNB| zCdQ`a1_lNO=>_^B`URN<x|w;!C5bsXx)uhx*%{eJIUqqWjxS5iOUW<N2ic#JTB4tu z1Y#AZmK1;!fL=jm5hnu!gE}Z>ae%zaD8$Id$i`SDk3F#UU|vrKB`B~4Xjp^8+XgAT z7cebkU}UIa$YL&%1Cek(OOaj;Llz5!pTd~Jh!p-zensq{&|xbAxdsy4tVOBCsU=0+ z3=9lKpbS#P15&|Q#0#PLK;rx$LI6YvGB7acg1iG##lXnN$i~P8##J&nyaYBL#Xlgw zIfKjqIiiH2i4mMO7(r=6*e}1tGq)foH8(Y{BsImgs3^Zk6XKR4up__($R)RUpg|p< zmzbMs3Nj9qHW`?zlyNu&Sv`^NDH4JN0w^rd?dJd`<I=?RR7)hgam6c4Ej%BAQaUIq zz~R8e$iPr>0GyK;n;DxKT^M3F)H2mDWHBvZu3@ZUl4MxOSj$|)T*8vYn$1+?SHqCS zwtzi_v4$awqlO`ivxaFQ3nN1bR~B~-Lp)CaLm?knEpIkcQA!C{79WZze>PJQAJ}Yx zg$%VUHB2c?*-S+XY8X?PBthv(FooF$L<=ntu3^X$tYKNm#0WBxAqynJSi_XUEWrRG z#Ti;bI-v653^j}?EKn1ez$S>4aAk>RGZp=*0qGT6$N*w35MKx~T_T&M=nu?oH4IrI z!3>(LepQO9#R{s$3XtrhkdaxUkP1oy3W+5ONtGq33aZ861Y874LNEXS|Nmc8@)m1R zVqSXcE#{omydqF4zQvW7T2T^T3@UPqKn3e9R@a~)|DaoJIr-`7sYSO~Q&N*k(~E>b z=~)CsfHK!DHb4K6cwg6BY!IEd*gQjmL3|E3|4=`dc+Zeqtid6UK_Rz<(^E_0lS_+= zQu81s56EIrb^vFeTP$g*sVTQu!Pej6ba4%Fbq?|LbHBx(o?jB5nwMXio)MptSdw^) z4{T0;URq{KYF={cEuml!|DX`((2)2Lk094z4}TvQO;&I=yu|_Xe0*_9(JjWzTRgDh z59GmH9H3+!4{`!HYk&z*{wPvnU|_HXB~3kWIU>X;z{thO!N|wR!N>w;fk=pm5R(KW z7ZV>74<i>yo~cS2M-~Ek4JGS<vK%-GgG!DXhAf5!j0-^pJ)@r{6F4}E)Ntk?uv8St zg&<QH7^_rq*oqoXnv8y$JfKPfl<(u?Z*j%P=jNxB=A_2Q-{OgnFDy;Wfy%JQ$EV~c z$H#-q;381Tb&I2*D8C@JsH74p_CWy!cFQeZXqAzinv)YBkI3+vj78vL5FD<coD0%Y z3=-mCW?|xE<Kf_8;bGyB1sAA(nrydtL6HKl28uxbyTzKCSDIT~1WIe*R0&p$umi#Z W*>H=)2I3(*IZ)t$QZNsr05bqsT_I=y literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25fdd2ca788dae91dc6702a7e6d82616c66495e2 GIT binary patch literal 1131 zcmZ?b<>g{vU|`Vf?~J*_&cN^(#DQTJ1_lNP1_p-W1_lO(6owSW9EM!RC`LvQn<<AW zmpO_V%x2DE$z_dV1+!Ul*mBvU*uiYp9FAPhC{8e&Er%<YJBl03X3yct<&EM6vpI73 za`~h9!EDYPfn32TK}H65h7_(8?iPj=?o`HR<|v^Qo?r$|-j|FZhcez0a?VIB3QjF? zFUl`12q?-=N-ff4yu}q7;%0&11$%i0!+G4Uq0U|ba4wI#laaBZ5u6W__6|aDodYaQ zEa6-(r_6LyI1i*YBpkv`h6NOe1_c&~E|z0pU`S<%VoYI(VoG6YXGmjAVM<|c;f!K# zXJBE7VhLu@WWB}j>*O4a<N?2ACXi+Z1_lt#!N9=43<`J`1_p)_h7!gahGwQLrW(c+ z#$HB7h7#sxh7y)$h7#6hh7z`Bh7$H>h7yiuh7!(Zh7zu3hIEb^hIsB8h6Owe89)IW z%%I8Sr^$GWJ0~$OJw7cnrzEvVllK;DacMznQ4u!-1H&zj`1s7c%#!%{B9OgBAkP%B zGB7X{v4IG75CL*j5hsWRN-?+C3&0^?e2cXxwK%mzlj#;qacWLl5f3DiIOF4!a}tY- z<KtH{{Ho9|D9S8LEJ@WbODxh)%g;$kEh^SGGS)XXGczl<D6upz&Wlg6Fv_(|u{1R? zHZ3<WFfd3j&=1is$Sly!%quQQ%*oNUFv!i$$TrFW34(EaS!!NNevy81Mq*J)YKeYs zQgU%RC{aM1rdLo|#K*wEpalv^5m4|l3Nf)TB10~wDhafh(1V49CZnGwD=1*{5_41I z<8N`r$LHp!l;(igJn`{`rHMHZ8L%a{c%dFnPR+@Qk1rAi1r&(TWGoT_u|W<1hqWfi zIpA1k1oQngg>MOgyilB4g5>%lkdj+mr6p+=5buCv<`!3RR%S6&02E8NxKm4$vkIUh zpeVb=lb!@h-cTV>1cDW17ePfpv3ZL-xxmuI5-I|U+FM*nndzob0Z=r9HI<Y@ML=;5 db}qta5EjT^w>WGdL1PC>{KX*u@-U)7W&qV38OQ(t literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d38adbfc76c905fab9be0cc176d0a50c55d9a708 GIT binary patch literal 15686 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76f2a03a86881f1d1557d1bd6082373c7b625ba4 GIT binary patch literal 2993 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4747a65c3c4b61ad95ed88e2ded75473f94b3dc7 GIT binary patch literal 1621 zcmZ?b<>g{vU|`Vf?~J*{%fRp$#DQTJ1_lNP1_p-WISdR8DGVu$ISjdsQH+crHd78$ zE^`z!n9ZESlFJ&!n#&f&mdhT+p34!%k;@synadT$1(s*Y;m+lW;>qQW;sx_rbNF)k zqxf?Lq6ENvwj9A+p(r6Rn>|N3S0qXV%;v}u%@vCh1G71E#B(L0Bp4ao8B(}XxLX)f zxKkOMnWH3Ac!C);d0#SuJi&NN$T=giC^)smy(qu5AfPBeDYZzG@s@aSW?p(us#9f2 zDpVdS#db?1JTuSG$kfoevM4hrCo|bMKP5Hi7MFK^rbQ8iE$ow6l9^|UszAUuF&R~a z+cPQG!psb!2h1@w1#>i+ZV7;mFn2FXP0a?2-4cXYYm5-mWV$5+R%Yr{nv<Sbl$n?Z zQ7Q^iYKSVV$#{!D#535;$RH#mF%zs(lkt`iM6IbuYEn^ZIZTuX!iD;o@s<$8o{-X_ z?9Ac}u&QKOoP%g)5CMvJ83qQ1RE8+V6ox3Kc7`;@6vh;$7LF+9b_N!PD3)LbP3Bwt z!A{P>NTHn!iU^Q?P~zcbU|;|lR=k9PfuV$<gt3O9nP~yjLIy^L66O+?X2ufc5>_zD z1}53TBnOz}1e07~k{e9&fJt63$p<F+n;Fx2Y8c`LN(7r3YC)z6r7+eoHZ#{Ul`xkG zr7(fn%r%S)glm{;m=`iJGSo0+2`mt)VFdBhnHMsGL>7pGT$I89@{pffh^E*r*5cBF z)S@CG1_p*(9P#m)d6^~g@kJo76oLFz#LB?HP{alz*g*sbh~NYfpv+Xn4Px<t2v7hN z@qt)^Afwm|z$vo0NB|_n4-yhAPA!Sg1tq$8sN^lS)QXbSyp&t4MXAN9C7LX^Sc+3~ z(r)o)fFl*E?3QRwetKqdVop4&ut-^EaVff}CgUy6`1s_U#Ny)k_>~O5D)bAAGRqQ6 zQuWIci}cg-b5c@^iuH|*^^MKU%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W z3v@H{ic1o6a&#>Wa<enCjdDPOU>skTnwOGaq@SFTSd@}lqF<bpT$~Qdh!CIY6;u|9 zFfcIafRYx7U|{59Vq?UBtZa-tOl*uSj2vJ&9!4%k4yGyzw1lPyixy2*P!#1Q=BCES z-{Oh~1!iduh|LopUs#%$1CasSe2W(v3dyNCIq~sDa-e7c5t@uevLLoRhyca9Hpq=k z3=9k$jNnw@rzv$y2;{Hg)Dk2w6@ir8;xA5uN<lmdPAInoa}x8?lcB{5IEL}3om+e$ z4e6jV0-_q8mTn1wWRhUT0z?*`zHae?WJ@v<Ga(Y7<aUc6BnC+t5K(Yq<AI1kT?tBr zw*){6OG?2d0YoJzrGov82p$Lv6gamyY;yBcN^?@}K;cyk3Mw8(9!3Rb0Y(8P5Q~SA GhZz79$g#Ho literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957dcbc414443bae19f9ba82af10f62b7e74df45 GIT binary patch literal 2447 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 Dn}|+v literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..022ccc77120d2cac3cb1aae0a9ca64aef9fec0bc GIT binary patch literal 5837 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 UW?=?JEC&-0qX;<Sco=z@0VY@;TL1t6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9342bcca6713dfab88b27708f920c36db796e463 GIT binary patch literal 1978 zcmZ?b<>g{vU|`Vf?~FOe#lY|w#DQTJ1_lNP1_p*=4+aK?6owSW9EM!RC`LvQn<<AW zmpO_#mnDh?%xBJF&1H*X1G8Cj*mF6eI2ak+8B$nN*jgA;*isprnWH#U*n=4~IbJe? zEM&aJ>zt8T6r5TTP?VpPTBONziwDHY%u5e0Ni0dd#p9cpoROKA3g&4t-V$=oPk~87 zr8F6D@rH)DS;PnX#{2raxcVf+oDQOyK?KP8Aq)%*sSHt!DGX6eDU4Cf?F?y*DNHHM zEgVrSU^Yt%YYRsdYbsj`TMBy%Lo;I(dn#KBM+zsH&5^>D!rj6U#hJpB!rQ_S#nsNh z!VtwB%%I74iwk5u$l0ky=@9E4*e8Sh2jYNekRw32Sc`#yp@gA?v4)|UX#vwh21bSw z<`R}>#u|or))a;shIqCbh6U^(@f3z&22DmkO^#cv#ia$QMMdlk3=Fq8;^Q;(GE3s) zi&z;L7>d|HVw}m~Ac-%|y~P`!SDG82n-rg%kyuoGi?t}VIJHER@fJ&QYEGIa<1Nnk z_~e|#;^O%Dl?=a%^$UtJ%Mwdc^~(~A^waWlQc{bG^^J`6jm^x=$}LJP&5QHmQ!I>f zEmJH_O^i*;4Gatn(hKxM^b0ZzbTjjcOA>Q(bS(^Wvoo@dazKJ$9AB22my%zk4{}0E zYKeYnNt#6gICAw0DvLN77#P$*(ZK-@8$L!ZMmEMOVMGAx!F-540F^KTu!bRv84{E! zpkQPH2ON{%OOW}RtVJMuz+qR!0}3%vIxpe|C%qzG2*n2y=LZo2AOfUJ2joIf;4(0R zTv#Q5<UVkiqBsr|!_FWbpsbR@7|fu_<X6R7T9T$~Q3NtqlM!qcm<=I77Tw|jg-~&7 zNqk;nZmJ<jKNHB!OjY7Ywjrw_Xz48mu<<zT<H$+OOD|1KPc=od3pwOr^2uO#FfcHH z`~$*Z&rM-qV5rEdVRT`LO{!(8VaQ@wz*xhykg=AzhPi|(i#eOANT-A)ixrfJ0~iX~ zz@qHgOhry5ELj{VqMX@GMQmUbxE3;`FlMuYcq|NA+$l`v3``91+=Xo63^fc{JS8ky zyxB}eeKiaV_!fdh__JAx`e5dPR0K0<GW)#*Ik*TE4VnT)pcuZzm6uvk5?>4|LW)2> zxW(!k6yzUN1j>ZB*!=uM;(c9ju|X8vV)G0M2Jt!E{6qa*;ypudu?B}Y28G-bPERd~ zPcAJgO3f<)XQ`ajJaFQ<#R@k17N?7Ah^upmr=R;RKCs&SytK@e)V$=>TSCDe{y`zm zp&{`h9zm|b9{xTqnk?XSaEl|UvLrRWxTNS7WAZH?SndV86_i}SaaaUSA}ndCsVSDA z=#m2^4Mr|T9!4%k4n`I@$;T+f#KXwP$iY;_kCbdc`rye06gnV}gQHOoREjg!GJ=9X zg(;h%NUa9M24Mza21|xo#uVlnMhS*sh8o6T25@F#@k?Ll{;*19-Fy3&piBWR<38AH zGC@Lv*Wb@I-r2)3C_W&_-$|1R;!U>FyqwJJRET%L9s~KQNP&TY!3X3eP((3+y&?c| zz9f?KQNvP`2UPCmCFZ8a$KT?LkI&6dDa`?~dE(;>OA~V-GDYg3+zTpSz&ZUEM?q13 zL26M+Wswj_LIgypf(VcUZt+4(!sOJPocMTz8#Nh=z~uqhsh}cP8RS%u5C<a*6Av2? zD-R0~3x{wKNX}1_>lQCGheC?DB2ZZ0Vol8}%`FBeHc09df<!Vn(d0rZv?5Reev2(P oDY>{f7hI5ojYPNv!UDPD7KaVQ%XTs#$AC&S9!3F19!4G(0F=tX1ONa4 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..471ac46e16d28f0db4cb5cb33258f55bf7c1cc40 GIT binary patch literal 447 zcmZ?b<>g{vU|`Vf?~M7xz`*br#DQUE1_lNP1_p*=F$M;P6ox2<6vimVRK^8NDNG9) zqnJ~egBdhgsy1_lWMmdA<mRW8=A<g5R%8~J6f5NC<y0z^<SP_s<`(2+rd28wrIr+B zrj}*qr7M(Vq$-r978Pga=PBfs<|d^UDdeXqBxfWRrKFZ{r4{ApDwJoIWMt+k6sMMy z7U&gJDkSEmD1arPsuYS#lL``(vlG)(i}kp;tP)F0GV+V86kHPX6r6Gr^T5g!G*S}t z^pap)hxFXU%pASs{9H}0Dpq4X13i;ljCy{WEVtO><5TjJ<Ku5}$Hzk*79W3$wYVTB zv*Z?gm}^k5r@!Ayh9Wiw1_<%1K);|Uvn;VBRlh8;NIxw<CndG0Sl`H4-`LE|tlXl+ z(!4k?KE=W)*D}S@)Wq1d+`z!VAiY38M86=jKsPh5xFj(rN7uq2H#;NSC<i16#_?sT nc`5lt`e5g$mgqwrqgPOQi^C=t9Kd!UM-;O#Ffgz%u`mJv)8&hI literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## 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 ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## 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 + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62f04742bcc69a6a4bb65387b0694d4124916ebb GIT binary patch literal 204 zcmZ?b<>g{vU|`Vf?~Gw&U|@I*;=nLSz=45*p_qk%fgyz<m_d`#ZzV$!NEku<D%CG2 z$}CGPN!2e)EYeTQ&q+xwD%LkL);BgYGb^_!u{1Bvi%+pI%C$_fG&M0cEjKVQFi0=Z z5795kEYQu&D=taQ$<ehi$j#2kHp&4Bf^mFVYF<iyk$!SUVo^$JiGFfUrha^UW?p7V Ze7s&k<t+}I-29Z%oK!oIbBaMu1^|g~G@$?h literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c83f56c3d12636d8ec94242e0da56a0d5f3cad58 GIT binary patch literal 2693 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 Xm_(R37&(}D7<m|Zn7L%Q<Tw}sCVL+K literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +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 '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: 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 {0}'.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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## 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 + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## 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 +# <http:#www.edu.tw:81/mandr/> + +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,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, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,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, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,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, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,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,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,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,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,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, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,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,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,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, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,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, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,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,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +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,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +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,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,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,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,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,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,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## 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 ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,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, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,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, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,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, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,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, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,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, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,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, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,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, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,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, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,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, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,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, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,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, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,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, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,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, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,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,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,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, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,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, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,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, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,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, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,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, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,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, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,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, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,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, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,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,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,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,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,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,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,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, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,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,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,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,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,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,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,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,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,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,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,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,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,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,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,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,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,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,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,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, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,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,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,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,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,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,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,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,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,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,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,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,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,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,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,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,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,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,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,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,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,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,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,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,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,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,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,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,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,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,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,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,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,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,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,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,0,0,0, +0,0,0,0,0,0,0,0,0,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,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,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,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,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,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,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,0,0,0,0,0, +0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,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,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,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,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,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,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,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,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,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,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,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,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,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,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,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,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, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,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, +3,0,0,0,1,1,0,1,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,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, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,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, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,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, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,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,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +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,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,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, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +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,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +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, +2,1,2,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,2,2,2, +0,2,0,1,2,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,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,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, +2,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, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +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,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +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,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,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, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,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, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,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, +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,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,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,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +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,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,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,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +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,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +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,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,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, +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,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,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,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,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, +1,0,0,1,0,0,1,0,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,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +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,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,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, +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,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,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,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,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,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +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,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,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,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,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, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,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, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,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,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,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, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,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, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,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, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,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, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,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,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,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, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,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, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,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,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,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,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,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,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,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, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,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, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,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, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,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,3,3,3,3,1,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, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,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,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,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, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0, +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,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,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,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,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +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,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,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, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,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,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, +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,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, +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,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,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, +2,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## 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 +# Özgür Baskın - Turkish Language Model +# +# 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 ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,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, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +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,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,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, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,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, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,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,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,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,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,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,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,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,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,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,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +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,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,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,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,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, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,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,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,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,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,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,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,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, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## 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 CharacterCategory, ProbingState, SequenceLikelihood + + +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.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + 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'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # 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 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## 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 .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## 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', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +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__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..2a3bf47 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,6 @@ +# 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.1' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a277bc61fc179c53148703a6fcc2319288f1b541 GIT binary patch literal 452 zcmZ?b<>g{vU|`Vf?~HlRz`*br#DQTZ1_lNP1_p*=7X}7~6owSW9EM!RD8^i-D5hNI zDCS(2C>BPLI8zR5E?X2^E_)PvE=LqcE@u=cSe!YBE0;Tpn~@=fC5k77HJCw@?Ik0~ zGL~B`nR%Hdx7borA#@Rh=1tDe$uCOGO^h!|ttioCxy9m^UzB=_#VIj4`xa|(No7vz zEjH)UqT>7_O~zZ?j(NqIA^G8%dB#RntOj}}dWL?QytlYOMrJ1FWEQ6ufqYQJ%)r1< z!~!B%85kIDu_WddXBM%6`0OBp14M9wWVk^xCHdtb1B*bxa*I1YzAUw<I5R&lK7J)b z5kE*Ni1<~cUr>};mRORiUzS*;pO&AKl3G-(Z)B`*Y-VOwZc$=sUYr-7VquhPnPO>b zVr*J&U|?X7UZ5YMUyxa#o0(T!l9-dDYhjR^osn&n0}=$|__EZzl>8!nSUBj%$Af$m eAFo$Xd5gm)H$SB`C)Ez*t74D`Bp4+ad6)p0hk2_2 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..008bbd093ef4d5be9a6b6835d6f9216fdb002fe5 GIT binary patch literal 3350 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d67359fb40bd9a6d93f9385af17ed7258b76913b GIT binary patch literal 7606 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 B^zi@y literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0044b704ca0000d95ed3b43a5f1585c1a8f081c GIT binary patch literal 1671 zcmZ?b<>g{vU|`Vf?~JKtXJB{?;=nKq0|SEt0|P^G2?GN|3PTEG4nq`#W{hG4^O>TU zQkYVhbC`2kqF5LiQWz6iQy3H3QWz82Qy3FDQdkl>Q&>~jS{S0ZQiM`CQaD=}qqtMJ zQn*_fqIgmnvv^Z@Qg~Y!ni-?`QutE%TNtAFQv^~3TNt7QQW%37G=*P++~W6=5#&V1 zTilL$#hD@b;hA~HMsCR<DHvvAU|?_tIaPvzfuV#Ug&~`>NTh_Jgt3`%0n<VTMurrI zU<OS_KTYN$W(Ed^Tip3Ynd$MxB`Nu(CAT<>Qj1ed;uCXnRx%W^F)%=gUnTklMVV!Z zC8_#liADNp`8g@6MaB9?#`?x)W@hCUC6?yJdGRS0M!A+LmZm1grsW0(1_tQ``XTxS znFYF;dBr7(IXSu(2D#Z8*+w}aK`@RlOU+BkFVauW&&e-J%uUqK%*!mvOw7qFPSq=@ zEMjF~U=RZN1QhxVj2w($k&t9Cmw|x+M1$N2_H73P149jSu~Z2|4MPoM4O2REGh>ld z31bRlGh-8D2~!qxB1;KV7Hc9Kh@HZa%~52Q!jQ<GCsx8y!UED!!%)NA%*w)0!W7S( z$PQ8qRuz-NkjM#E#fGMeHIcJ~tGK0vdjU@g??OgKh7_hmE^z2F`&H?b7bO<hx+Ufm zrz#}p=cVOjCYKZ|lxLP?C?w`pD&&`Bq!uY87Ny&U6qTliX!6}+PRy&k#TAyAQ<~~p zRFq$Ii@CV6_!b)^Vv0b11#?o1iV#r-;_!hiDo9O%MIkqcA75Njl$w}(3t1ARm^-l~ zwIZ`5J|#ad^%fh1bBm)WH9fPqB((?}zM3qzI1@`t^1&(L7JG7jURi2U$t~96lA_Fl zTPz^c5h<gH9h8JvK=CFHiYX~jDr6F3<X~lEWMkrDWMdX%1e44xj9iRGpd^Vsu__=E zD<3Ga#xs>LgOjdI33CZ!JPSBj8T~X_!68uu%Be-%p!CTLB6vUqC@G-3j4dS<<ThiF z+c-dOW8`3D1EnNM1_lPWOF&r$<dJ-kG9|D}K#8c2k&&T_D}^D9fsrAcAqA9$7#JBM z;2DSs?4Kf#QJPG*SQ3lUi*K=ImxE|@cksfJczj7}MTr&29<XzmxEPrjxtNM%kevf^ zC&)?QbWMD~@PPsW5ikNEF7ALS0tXD(3b0FH0V4}?2`J}*TmcGF5C$t#1LZK5BBc^& z4y$2KVeDn8WvyXdz_^g1NU4T3i>a2O22{E*fl3!qkORa(gb1k2f)zK#8Tq9-De<6m z1WM4LWU9$lBo9)Ds-p;$qHeK+6c(fwp@nD>KLZ1U7bqM-USwcoVPs+C0s8?gqsijt z=NF<WSOh9RZgC~&=YhgKCo>70a&B=a<`rj_<d=g=PjD#+Nmbyq1P(@U;0c1<1PTg7 zJm2Dj8kL)vmzbVf1dg~OP?&+OMRFu4*dV!s!zMRBr8Fni4iu-wpqS=h<Y44r;$dcC TWMKkhW)4;^84h+nP7Zbe{Iy>z literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..921b275e0c3c333e44e16e97bf04a9a30442cc57 GIT binary patch literal 3865 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 VAo0K|**I8u*g06ZggCf3xBx01a0&nb literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25e57de3404ca302e9f69f0942b1fbf349d8e067 GIT binary patch literal 4613 zcmZ?b<>g{vU|`Vf?~GBCWMFs<;=nKq0|SEt0|P@bh)7{bVa#F3WsG8EWN>FlVM<|c zVMt+4Wol-QVs>XpVM$?aVMt*G^I6;(QrJ@1TNqN<!F<*fj$j5&&X<fJix_XQmS^S} z8zsYR0ns2CkR`=B3=9mZ3{i|J3{gxej8V)fOi?T;%u%c<EKzJJtWoSKY*8F3>`|O4 z98p{;oWTs5T(>yFGxMDDbMlK`f=ns`8TFEhfq~&AGl&5B;Uz1G#RekS85kJ+G`Vka z#K-3)=BCES-{Ojo&&^LM%>l7_;^PZT6LX+4tWG|T&fd3JoP0uEZ?U=uxw`t@VsVai z^t;6z<mz&Z-Ph6G)i1>H7F(pNkB@)&Ef)76*T|I&MPdvL5aL&%enC-YSz<}5epzCX zep-G`N@`KDzLBxMv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_ zNn%cpu7yEvc1E^Q4oDD;<I7U>Qu2%RlR>^t%uUoU&&(@HEy~p^s4N0`8syVr0R{#J z4n`If2$sbj@Dex!KA1t16&%RHC6zg;Mc@GC0EJ}(I4s$UxIzBq0TH|m3=Fr}{QQG_ z9er-GIR$yTdxYE)gwXL$j?UihLH?nBE{G6<u*5-nK@JcEB{q=jAr3DBiJ>?b<U4RW z=|gdD3R4S16mtr53QG$^6iW(g3R??96l;n?3P%cO3u6>pied_P3Qr4T6nlzN3U3Nu z3u6>VigF5nia-lv6laP`ieQRR3u6>lig1cZ3qurlifW2zidYL{6i<p;ig=1d3u6>- zih7DvigXKO6km!)icE@Z3u6?2id>3(3qzDZ3VSevrsgg7@XWlB)S}#EP#Od!Mi32h zvNOnEb_@&*B@7D~OBk}47BXfr*D%Dh)G#bytzpPwS;)x9P{WYLR>Kg_Uc->ZQNs|= zS;LUURl^X^ox)hd5YLms5X_*-<OdFZP2M6<0>35Yo?7CZpI4lplNy{{l$x67RGOBS zTI89RmVb*aIK;(2G~^a{xnoI5QD#zUNow&ej`)<+w8YY!l3Sd`sU`7=B_&10w^-xT z@{3Y$@xtUFT-Nxc#N=!wQ81S+z8I7UZt=ktL-=g*IhpAhC7O)4Sc+3~(jd_a&Ih2l z1?9HPyv&mLcu<5EgOUmZqW~ihBL@hwRtZ4EO)owkq6~Wg$}lj10tti}Qy4`U#6c{k z8ip)pCkAmy@Vo@2dQFxh6;O&&0}&b^LJM5*6lsIlU{`?&u+uoxVF3ZsQw$1M2F5Bu zn2X@D$zT}<1_lrfk5fI6lNeJN9T;jD;u&ffQ<&@-pghJJ#uBD1<`SkX7AFR<JS#X3 znf;1DC2kR@B+_I<aw#Zmia>rWk_EXF<Zw+Uu$ynOmL=wtrlN&vkun1VgE}Z>fpQE3 zBNrndlEdNg>xbRtAm7$7EC2-|BQ*7af|4<Xv6qpNA%&@iA)XoPUQNbZtl*>qNqj6| zi;I*%d7T?%O)?}27J)+<>SE6Py!hghl+>akG*{o^EJ_7wO3cXtmG#9CxAUO59j?MH z8C2SUauSG!hq@0W)ETlliuh_6vKVR^Ye0E~v4*KgtA>GvA&aSmIg7=gfr%lWDNhI? z!q4Cf7OP>%Vy$6@`V^9IG#QJGK#7E{NEH<LpwI#P2V4X}V#N?7&jN`M7I2nf1t)s2 zMl@d*nJ_RgfHV~Ifn3kX!N|tQ#>B!X#3aO6#RE%RAVUVghoCf51kN0w7=!o_oa8_b z)`a;Gl;4X?L4g4Z7<B)cF)%RLfYKg5|ACB12E`gE3_vspgUdot_|`C{V8$Rr7E=uq z)|g=~(gZmMlr4(D4rPW!1uM7&!Ws$Y3=9nJAV-3#D+Wj;Fjn!xf*-6A?mkco17WcH z3=k<y0F+A>GSo7bFlI5;GS@H_DU>i~G1oGeFfL%JVXk3Z$i&D1&MAz3nyf{j5&>K~ z7b$=;2&fo#4GOv?9t<z4LsBbB;AJv2xQjp*g8gudEh8~6B?lw3gS_ku@(ZN&1eKg@ zj4X_7j8(#L|D=}0L-Qg$&x1l7gu%W7WjIg`RKvIs<QJwICKiS)<`hPAP_AGG^H`uf zmKr8VeFLh(G+7}&k_Y)nAf?>7w5T}0C?LN$vm`S=?-pakEyhSqNOTlgfz)smK;_Vq z%`F~Kc?y#Z1$hS&H9X9Gpb|g?<`raR*kcIf7ibCs*Nr6%S&ZP=kpb1Owag_93z*Sk zhXvvdP{b5jfZQp8h!s>n!J-9JXM>{!>@RfR2!jf;WN=`_!#ouW@)R_Vm_hLa!d22R zk73aPF9AR`0;r`5jw>f{YaxrVmZgTdNC507P-}s?hGijREo%*H7E2A2I71C<7HbWo zI71p!En5kw{lHSgmcp3A)XNM_lgxf@nvA#D5>v8Di%T@w(E^~z9+ahQK?Eo>7lE2q zn(UB##aMBRu@cGeprE)V2r(!%1@2$;FyV!U2Si~yA~YbWm5Wh?u}Tyc8YpVPwF^A5 zIT;ujKy?E+FwVgO1C;$BfdP%+g`fap$zsW3tpSm2A`G<<7KmieViRGgVaa08Vijko zWvgLKVa#SKiUNt$ve&TIut_k~a^zWns_ks1qLLDZ1so}iDU1u5YT0YpYB}=cY8X?P zvzdzeP-IwZIr3OQ8NP&J0cQ<!3QG+~4f{eCMo{C9tA@FTVFC9-2ACMsgi|F93wUan zQ&{1J1skL(2kx#Efnxm^qk<+AgbU7dkTxE;6agpJB5>|wODPY|tV%5cM;AEatU(Ex z)!E-a$mN!lTV_rUv_<G&T2fG2;+&CKl$czST7*RoUI;-7EpX&>LL#3fH$Np65&5@R zl8civZ}BIm=HwK|XXeEhgPWVTgdqY+si2xH9uk|kxYCO9bK{fq^NUh$@j(=n<j1EL zB^IL>YPWd6qEOTFL1_h4yfd&s(+ZOSlLWZb=3?Yv<Y8okkjyMh0!$)|986X4;sV(i zcnSh#CwK~4g+B#BQic^M4S~}SYZe=bodrrEY<V8g6cSUyuz)><5iG;8kO{1kC5x?= zEl&*^&vjT-u!2>frWm#wR*Vz_6$7O#O;+^OQ3R^TG<neTFDOkEfl@$`2Rsvdf>_|B z;RRxOg9uQq1kKn*pw<&2YKuUXN>KnvQ6Pu_w~WCAxOvP43EG^@ywrYB{D8_%c>I9l zMu?GvQGgK?LjsIk;JB$0g5__7W_X2!(tHLr9$*y`w7_EY(_{ks@)kd$a1O~V$w`Gb zhD$)aBCs351lXbA4h>jl1<0KsYmnRVpmG;1tI6o6$?WIm1|gXI+%#dB(M^*HTm~U% zLA1VY5vbOI<Q7olyT}+6VxXp85vV;>1Zr=9+a{25)e$7?1|ot$L@<a50})_XBM6ZD zi{uy>7(hbBpdJ7R69*3mGY2adD;GBxHy0Zh2L}fi7Z(SY0+%FMrJp9-Ee1$1vE?Ua qr6!jYfoge3TMlFtQt*IGEdtqbi^B#o(qRV*9dOH=hed!}fE569jkU-C literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# 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 = '\007' + + +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +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\\]((?:.|;)*?)(\x07)\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 in '\x07': # \x07 = BEL + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,80 @@ +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,152 @@ +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,169 @@ +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..a786b4d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.8' + +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..221fdcafa9e3cbe8cbf92bdb8dcd71af6684a7da GIT binary patch literal 1050 zcmZ?b<>g{vU|`Vf?~HL}Vqka-;=nKm0|SEt0|P^G9s>hI3PTEG4nq_}3R4uLJ3|U{ z3QG$^3QH<eGjkMkr9cWp3TqBSE=v>(BSSbto*D~7Dr+`ZQ4k{o2)Z+*u%)oKFr=`j zGGwteGe@yRGUPEuFr+dpU{B>($QZ?$%DI3mm8F?sAtNJ03S%&XCdW&VEBvZh4fKrk zERsPS7-obyi-&=MA(bJDF@+(D39O0fmVirUaY;^Ql50hBYC%b6ex9Eu^DU0}_`Jm2 z)cE*YT=DU_`6;D2AU02Yd|_!~4n$@pLlGMT1BCchs9#W&S(aFms$Z5^q@R|blag9g ztZ!tjZ)|2}R&G&ZX<nQcpJHK@YnftcYGQ0!ZeU<wkY1o4qF<0%pqrUjT#}fRqibQ1 zo1Kwulmik3<M^`Fyp;SR{S=53_2c6+^D;}~<Mj$Ei<lS~7`Q<}4PtOGg87<^x48XE zb8<Wq^HOqBi%`M<qzoK2Dkx!)!qmbL#SDp@D3%n~6t)(IDAp8qP=FSJqB9w!5fqRh z8WfPuAWK=m@f*yb$>;|T22G}0EXAogX}8#lQj_zGQow=`f}MeZ;TBs4*hxYly&%J? zgpk~+2azP!rXo&IxPuZQ!~$?MfNfz(&CM(khT9>4YzIgx8RUMD^&lGLAFy9QCZ#ac zFvK&YFo1oe$#{z;CqFq`lM!MS*a9#CwuLLXC^fMp)h9nWTLf;G7_wam1%8@rMa&@Q zfF6~qEXS`jEA7V&|&U~>@!$Odq@3xbRWiE}W5AXrS3`xbjnetLRlUivNW`1rEa zqT<Z_y!iNAobc2OP6uGcx41oX3-XIfT#JhGi*B())5I;#^wbic{PgtHBCx}5v4IRs yExN^(n34ijgA}YF2NZ$abc@3Vk`L@aykY?c1_ll$7A65^CPo29K1K;vE=B-deBP=6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cd80c23728674c89c3fb192aadc93d7044899c1 GIT binary patch literal 32060 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd950ae012c6070f25a82e580a7bea2bb45e1c9f GIT binary patch literal 42581 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39ed30b5ccc986dba11e5e482392009c76834f2 GIT binary patch literal 17346 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̪nPm1Vg*O}E%x-(lEjjdqM{~Hl?m#Q7J<6J zMWC+aEtbr@wESDlnRz8eji639b53erQ8q{+XeAwZ{v6W9ZUMEa1t5cUpxp$wIAFQp z78@j)f+p8NJ1Rht8^r+;OD&3GgQT@6=9IL8DCXj{f?MnvsfnNsM7KDTa`Kb2i!-ZI zZ?S+#h!Z%#qIspcw^+ffTWpX$7wD~TURXW{H{44>H9DxTz#s-%_Q%7-$H>LR!pOtO z$HK$R#|T*r2pZZ0)$u%xAQ>j`3_WNE5oo3!v~HD!QG`i^Sp+=L$HT<N2%E#_VXTru z>8GPu4PT87YOa7<JD@>`Vk-s)&`KN7HU@?wu^OfYpzSW;1*<g-SxiM5P!Vt=p@g}H zsSmW_h<O1EXmMaLgC=9uU3g9o1}(fyR6tMZ@MY4_&7}#TF*)!`<HWoa1;|PVh0GGf znmO2lUd$4;D76rhAE9L)$RyBOVMJy^Sy=`yB4MUMYDBQT8dw|&QX2$a6^&GsYO;b? z$rphJi;F-Dp^89_sUlGF)P$^@zr|dXT6l{Cx<Rh^78_{YS!xklG61LLL!ih9Z%E-_ z0gugs#%DPgt0Yk(4dfx%;^$;gJb?y&LApSLv*0*;0*N#5R)t!YiijFU7lzmX$V!V6 z#u~N~rV?gQGp<;thAo}3maW35hRuZ`R;!l1h8eVVsfI<IA%&@iRg7T)D`-+Tg{6ia z!b$@#UM@5WXDAd1XQ(i%VRB)J)r(;Ut<|XILekAz!%@QtY92xKrLfd+LG@;ZGa#vB z6lX|bNdu>z6t)H6q2XF?(9o_ps2Rso!d}8r!`;l-%$UM4hpCpggtLYri>rpahPN5C zM4B^E4SBVdD|ofI0%VvAT&{zvtzvM2RFDr@Yy?^lou>ebO@(6chGWcB1kn#kNDwwG z9f68?_#z?&4X`9=EQqK|3wgsFWNZiQI+#5<sl|k?0qFo+2+veVRfvKDc<?G7w3e$_ z6SB?<k@AZ{YmIbut2ALHze{E@c!O1Dex4O5h;ns7;|12>CE&J7s>MpswGf{{>8r|u zXl>SDSAbjzHU(@iFITY~0|P^DX--LIL1Iyfep-GJ%)TVhd{kmlrL87Y6%Wi7(8Lj< zl7duPn%uWIV2X=ofeQE8AObWE0T~)825~`ysJEDlONxpXfViOQ0ldpalMhnrPXdX8 zhCpwzf?QHuv>sGpFlOIk12+MRZ!wnLV$M#jECNmA++qa_-eO70PpQ1clw4A@1f(52 z4Fe`Xb1~rY*h`?i3!2*jEt_Hk&$h5JfeK_cMo<CG#3;rnzzE9Kpq1QAj66(YOk9i{ zOiYXdOjXh-`5Ur;1S5xoN@dWP3OI*5f!9aYFqSYjGZhJ?FxD_;GS)JdfJ$j*&_HT0 zQ!R6q04Se<##jpUK${MO8ETkQSeqG}85lvkoEd@{G}-*X1I6i}7-nGLaL{DD#a@z` zn+n<-%$%5)0<JhUSs{T9Dqf0sLEZ;foNUFZiABj7&{8gnwIsDDxA+zZXj^|`Nq$ij zXHh{iXq$gUC3;b}n}LDhFDSS`!`cksofe>)O@OIN7$qQ}7BKp0!V#;VUr`yz3FV+Q zcTjOAKd=gM(0*G`vWt(u#T6f)o1apelNuj?izhz5urx6TD#IQR8s3hN2S<C6F32qK z)<V#Rz#`Bb8f1VTv^Nm4Fb}@82Qr=51JW@WM1VW=(?P6NAOhSN0nZA8{D<UcL^|PT zU|;~%48@>sJ_id66AKfUEC&|{KL-y74~GbcFqaIMGM6|5BbNn-ESChA1eY&|0Ec!F zNS~%0xZ!h)9kkIPGcO%7A=(bI8MLgh2((4+7H0|gU<Z&iD7W9@_RIw}WxzYBqxe%w zb8{=>;Yw~XfSW|O*g!44#1hDsFK~82Y!3rhW}t|_#R8fJEdp)%F9JmyI3e8POiwNG z$xlyDEh^dzatU~BQVf)z;Csn~TpfLUZ?WYkWu+#UfPI23Xl`-XK;p{|WOuOw0|NtS Z4ikn!(+qr!LQFi23QQtQpau~O69BE$n*;y= literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f17ed8183fcd9e9590c9d6fc5aaeb48a0c2c4b19 GIT binary patch literal 38732 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf134e1ca80cdf44d814759756a657f674fc3972 GIT binary patch literal 10298 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 UhmnVohnbCui<ys6gq@EG0Io8mumAu6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f79912a9838c0b3303ed4d7080994aebc855b5ee GIT binary patch literal 4484 zcmZ?b<>g{vU|`Vf?~G9vWMFs<;=nKq0|SEt0|P^G7Xt%B3PTh_3S$aW4r3G}m}ZJ% z0@KV<%wU=&iY0|Pg(ZhImo17dmpzI-mm`XUks*aSg*AsWmn(`Zmph7^ks*aGoiU0h zg*}C%g&~U9ogsxYg{y@jg)5b>nK_C-g*%0(g&|5HRiK$6N-$a=mA{!GN+^Xdg*Sz* zg)vGvg(;XplfTNHD<H9`IJHP2Ex$;iBqLQJHLonQC_gVZHLpY=H?b%?wWwGjH#4~? zUpFT)FTFG|JyjtkH7zqQHANvaPa(iHK*7|&LXYbu$g6%Y89^byd`q;TvLquvFFrH3 zASV@MRANbHe%>vP(xRLKkaf3sic5+z^U~u>DhpDJHJNU)XXeG1rRJ60;sMLYLu|gq znVDCTT2xS!T9OPh8Ds~DW@cbua0UgZ90LPG2}2D-31c%;5nl~Mu}}(QFhdPP3X>#5 z3UfAFFoPzGpIZ?~PZg88k|xtFuFT@hyyB9?yyVm(R*+*EZ!zYtWGLchU|{%FpkGjw zS(aFms$Z5^q@R|blag9gtZ!tjZ)|2}R&G&ZX<nQcpJHK@YnftcYGQ0!ZeU<wkY1o4 zqF<0%pbIuPCr8)9AU8WB+b9Pl2*x0vrQ{dsr(_nF<YXr4Lp)ckS5SG2J3g~GJ}0vz zwJ0%1667N`upjvtSs06W85kInL0lLH34l{k8Uq7EDnk@w3IizRL@}o@r7*WJq_BWV zRxrs1CfUIx2bkmplU!hu8%*+mNnS9?2PXOF@I<ks2&4$MFhsGY2n91}3g6;%ElbQP zO)SYTs<P%%P*6|^$;d2LNX|(tE>_4aRwyk_O;ISxS4f4ZN`)pGh180I)Z*gI{Jdg4 zu&!h#s5d|~2!kV#gMopehM|Tr8<ZLu{lL+n$#jdc;ud2im;)hr7#J9CaoFS}<|d^i z+Npp73S?T95ZrBgFiBGEDdJ~fU?>s*5uo@-*i|IRz`&pivj)47AZ-w*7w~~;mS6@= zxEJsnt%l!dc&IQFZ=^brMluj@qy~N?F#>=Dqc!mx4G#bk!c+^tkr=Ke!Dwx)MuSQf zq(q$0R>Meq*y<2tWC2M=>S8q#Gpm70MIzIw9+5_}6Yp_-n30-1RZO<FRm`@wwpC1Z zwpC1uw!au{s+eqSe=*usG1=MPVouCUxy6)Ubc-o7uZk@%zeFK3FBw$!gYrHn0|Nu7 z00+mw6-Yh62(Aa5Y8X=(B^gqfve}AMY8XLPX)BW?LoIXRg&M{hrfl{iixQ?3)*41J zhGxbl#u}y?Mv!b?UkO7EV+nIJQ*l5EOA})aV+xxjLoG`UOASL7Yc_jPUI|+YdkqUz z7h?*CBttE04Py$YBttD*340A#q?xg31(?k#$pB_ErEt}-*09vDr7=TwGA!VzVXa|W z$W+T-17fp**&HBSYFH#0YS?Qynwe^uYe1QwyQ&#ndV<PbXjzx4kcd>q7C{PGg`(7w z(jri$oKy*}#;wvy^OCI+Ahl^xYGG++5x62wfEx!=0IHQi)i|i)FD^(;&P>ZpO;JeB z&nro-D1nsQAe-S8Xb~tiz5M_G|NknH(!A`v{PH}7vc#gy#H5^5D+Sf!TTJ-{Rbu%C z3gF0sRsN|dU^(WTjN)6&MH$6aGMRa0i8+}dn{o>hi!zJz^FS&TRErf<i#0imKyeGM zoo{gmSLT%@R=5@w<rm#zNy$tuxy9#LT%1}2aydklE59JM2;9CXz9sCJU*d_d7OVhV zkKW>d)lZt7w^)i(bJA|Hq*fFZ-C~D&_7+=FYH?{!Ns$Bt149%`YEDLR6iaGRMsX3S zS}u~pQb#B-FfbT_QZuMNVqoQB<YDAv;$Y-q<YMAu<X{BxIT$$@B^ZU6co=yY1sIX5 zE0}ZqG}&%(#K-3)=BCES-{Ojo&&^LM%>l7_;^PZT6LX+4?D6p_`N{F|MW7~65y)yt zZG~2E@i8zkfK(LAFfcH1FtaeTF=B%}%tauT@YV&WeF|z_fHPAAsEx{)!qmc0%TU5l z!kEI`%v7WSYGh?GWidB1)-skbW-(>4)H3C9q_EU7rm)sBfih7EYZglh+XD853?*y} zIKU()nB)SJ%nKPxxJ!7N8JZbO*cR}D#dsGoq%fqgfwE@_V-{Nq`y3u<!sqaVxA;Ig z9^}AaP*~f59aqDU#ZbeL#aP3T#RSS%wICKV$Qdb2*~~>2HH<Y(Da?`#CE&c<%qY%a z&QQw;E}vQasyI}O^}y&BYg%SrVh%WYYqH&9%}vb8FS^B=o0$ipl8f?h@f4-zq$U=p z=A@RT=G<Z~E-AXjR-9UtnV6%=e2XPBFD?HTds%7`sHJm@B|9@O1u0&@%@*Ob{G!~% zlK8aJoSb;5N<WZSz}*E#5k@vf4n{G?DxH+nw8YY!l6Yu})U(OSPfpA!w$sC6z%4$s zrZuC%Eryq%kkaJ2C5$QuPF%Od&;+3_xy7De3{fCZkds&fvMN3|F*zeMFZGrjTm*Y_ z9-#voMz{FkI*KccOHy-hA(TMvi$aLNn*730(~$${79Ug)s_hm}ab<Bl%ydn@TkIK$ z#fc>)MYouXD~pRvK-tp})JSB>OUzBZ#gt!sivy<m7CY2KMWFDx#SU{U8^n!8ph~U? z)b1{F1a$~lii|;~S%L@)5CO{G=#k2g7FoWa2nDt37#KO&K{=m`iG`7cnTe5!kp(FS zaxk(n@-cET6?uc&_MpNPRF#431|<e??rURUV5k%Tb!wU!W0-20YMH|s@{Cv*N*J@b zikui3YFQW=szgedQW$F(YFN^kAeBluLkd$0Q!Ps!O9VqCLmpEELk)9LN)0n86Qr<Y zGZ&?Rt2~ApW|)o=<`R}>Mo<M-R8_;efVGBkAtNIw=d#x@)vzuEwa3}2K7nfsPgo}m zQS&6`r9i73g+v8N$*GW%T9BHTl9`vTke`R#jnv};n_^XvSd^Fxt-7ofLNef8g_3*) zcs~zP=~#jKg>a?CB}K?4q*kORmx9WFSWbZ$2F*5*4hg6?3rYzJIr;h7r3J{QV$q(P zSWu9emkze1N;5PMRGoqPG;mizouW_-u8lx-6$tx*3yxom%2isWd7%DIatWv}RFs&R z0}6$d#F9i%<qGNUfi!@yCPxuFD4}w?RwSnufV@#84N7G)AVGc?S2xE{pOAQGf4>md zh>%-sr3ER8C8@VKq4h<65xDHvWV^)%F*ZsN!#_nzAfs4{Qj1G&F{TzNgG@)OCP3}$ zLQs+w0i{1qCPo290Y)V-$-&6N$i=A1=%*=C1nK}3xq<Y%fCzVxxlBc=x7d>Na|;qn z!1<{NR5U{>YnIZI%p6Eg0(+4?K0YxgCq5oh1GD8PWu+#UfGZww`Y!^Nf<*x!lR@r5 x%3@&Gf(uU$8%TX<2Wk?4D>W82P^HSj$iXDSD8R(V#K9_{&mqso$i&3P1ORd)5wHLN literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10155da7b702231704c7a854f084b0166bffcad9 GIT binary patch literal 27694 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 bwBmt<m4yie*_gPPxp)QY89<N=EW-={c9y{l literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88a85bff99abd62f0123958132a7ed50b5cf2ad6 GIT binary patch literal 10894 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 H@-YJdU+Rsm literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5938f84c5bdda3d73b50e0d4e9bd0b200dc3de5 GIT binary patch literal 11084 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 WF~R{}(jddkCB(tZCC<XkApii@pkYe@ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9319a09cc14a4724d93064d04db07b8574d3f719 GIT binary patch literal 47962 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e7b6297d5f4eebaa5c236feb6b22f786ea39b34 GIT binary patch literal 20434 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�Z;cafO-c-88yr)EZGc2UKKJm zOhq0wOew6A3@L2cU^b{f!pKml7tR2dO@qp^XEPP0)i6P2eL%}B7J$Zw85tQ0#ljg% zm_frS;2t~NX`r?xsILjiTE(C}f$5-*PD%-Aw+;hng)L~7F*c}{sf2j}OAS*E(?TZD z8rvcf(3pG*Lkbh9&Szm@X2@nNa!Fy%W-JQHV_{^-<EdeS%u&`d<#D92)-Z`PfCi`+ zuz^-rGBOm3fI3VI*izU)U7Q+Fear55i_ri)7=Me=@+GL%bBj@{icJd~?wahkc;jIc z`vHzYA>esJNV*b$OF&zXMQ)(zVXXp9{X%B+nZaocGH!)s0sSpb(Ed@-?0vB_69WUd zy$>Fz2d_O<VB}$ftVgYqi_b{~?O+AXULu<6aLq-aC0;NmgGWQE*dgxMy~P3A*a^a# zEJdJne~Y;wzX0qy@VuucBpVcg7Hi>lCpVJ)P9T?pW;+=eIe1yX>t#8>iyc8tNj}CR z(6Xy!(3A=cgQ6Nd;{=+KM63pYZ2e4S0nIsqw@|RAfQBpCia@I};B#)E(hY>cNf;D4 zkP$lAxF*Old~3i#?u-RF7-R+mW0f$<PGHDPEJ~V$XBSX&8q}?>FsNb3VsK%IRRhhA z*D#eZH8T}~QW-O-n+#&5FlRFq@uaZSG6pad@_^D;FoPy&f&)2LLSU0Tpt;;4P>_IQ zLz5XYN(|}|6qSSWGkE9(On?d?@ZOjNkO#nXI830G$)E;23nLq2l{BhnP^Mk|G}+LH zc0gfKgn#}M6!bA5+d#p<!N|dkJt9FhD=Z>GQ-`Unscc#7&5Tj(DU7M?DNHsDsT`2? z>``2x_C0t%3~0>|dl4uK!J|c>$+;@NI8f=07!Cnh3raSip%75%0FLzp(2ycz(2ysE zF&MNElVJg42@|MLSqNIW#ZqhpDkVT`?`xPAGJ}po2xh2ZS-`rG0koE?mNkX7hBce5 zD6EDRv~nti4K_bl!VVuyWcPEca&$&)A1y6Og=`}QZ~la~*Fb{+ux6iXu>yE=DPoDR zf@*OHqDK!dQ8YPjapjffrWR!;#}}nSx{#n=>n*mN{PgtHqFe0ciA8ytdFkLK1-ICW zAPa=>%yEFbin3S|3TOllG}ToMie}I>Fbksqc!3URWDvBRU4XGl9+F_troRw_mVTN% z=!piDBEaK;w^&j#lS{yB2O&d)b3lb1J4kb8PHNFwkdr`eK&n9zsTdUN*`Ra<8eisM zWMSfB<Y3}rs`3NJzh;acC>g*g4PDRzLIYh(_+ml>T}$0q(BedUjTmj*l8AMNpj8y0 zJO)lbAUh%T%0f_i588-%iz`0Z)i=yF2)0;DlMzx<gPjZ}z`1V<0|P@R$lZ|QqX@)@ z7Z;oi3=E(I3$_F_rVFcGAzfuqbyX}=0<L457;Bh7m0B%yt9uP|3PTDjs0ss(f5kA@ zvVb>rFxD_bYTIVeoGLSDL0}3;GZPa-Eqg6T4RlKfcmW=0fj_4oyp#kv1LR+DZ3>#~ zu3<<4?OGA2VN7GJWy({j0UaO00J3la1E}1pWiDZa6udReASX0~rg0(j)8K@Q+KvGE z9+Vxy#)DQxr-LSEr9k6ppi#RbsT#%wj42EY8S|KG7$H-&nv6wDK&>pMB2W=hv;x8g zFZIDv5rXFlr@{i7jiJgEG-3ii9|E<?%T3HqjR$X)M^uA|>0V7HNc9Zb6#}i;qSz9X zic|ASAaxsPxg1gg1;z0#E`*tVAQym=3n>3^FbOdWF;*!ObO}5`fPx7W6X0M14a|ds z3CA2ZF=KagK<)vV%Eo}x9SGkS^)fIp{9>$m35qIklR%RhoMOR8Gk{ANO-@KM-vY|5 z;GzUHpat5$kd<F_i#0bh4@4D!_Jcs$nyg8snK>!wLB@*`CcPk6f+o)x7&*8=r448S ziVTw+W6^HVm=dTwhhb0}C8a3<%3|<D4hjem2In_WiGtb`09i(;DX<viRFD}Aj8&p& z$9|wS20%p!NF~@dP(lGU15y|z!3#lBn6p7S5P7>r(N<6rX9Tb0fGuPK7bIW;WB|A> zUj}ypQ<W^b3#d?ogF<W($PQ3K#HhhRo&twID7uhqa8SLf$y5YN`+l0N=#>D-P;e!H zln@Z!0%=+evJw<r95{~sKv@aO0~!Ks0Ud|J0-6PgVgbz_fH&B3fKJDWVuP+aVh1~m z_ZIA&h+y!UGk)+HQ;;7)mV)C5RPTX$H1Q0ejZ*QTO;HT-@a4tK;LRDg*ug74Qj2bJ z7DEQuQj1{I;-H>f(Oyu-0Ie@Z@+mm(K&$mPfIJCmnlOOZ*jI@`hsPk!!aQLEl-fb* z6zn|ELj6h+P$GhyN5IIC!dS}`&X6a;!cfAL%~hlW9SvlvWrB_dg34oNzYsS~W{A5$ zO;T`PhP4{O?ErAo5gZ#}0_56T0-43};JtgWzUo$x(;=%LK>bcww*u7z=$ha;55*&( zndwT<u?o<`ERehb8Wh&T?F}Y~H$Xje5_|xSvAxJX0IjVAZPcrh!{Gy{Cb$nksRWc- zz)=BeN`vOsQy4*;HNlMnrYgud9cZ0xXfbqiSwT^La%wSn{H!=XHx)E!mY9-QlBkfD znVOS=SfE?QpHiBeTNw}9yr`g|TCAzbSabkX8bEg^fuji=IbZ@DLlW@7PKIxpj0def zItub9$hizGRcbhVho%MYOHe$4FxZ!%x(<}wAPs>OhFYdPE|9Nb+f`v*C{SuA7#-}; z>~b39I#8MhZI)yMt+Rlg6#&fyP<5c=E;!JO5l|i~+7HTMpwKBg2x1)q5#V4!5TF1m z+QY!WupVR^sCeOE<YEQQ5_7PD#o-<Xg%hYu1A7=0zu+D{BW&?Lq;G{K_`y5ZuYybm z)l6WXCi5*W#2C*lHb{p%iUT%NR&*HL-c3nOODxSPf!FyU+u=bj1L~<TlrUto7m0xO z3)e7+fzPJ_H3%g^8>pE4s>Dn4vh(uG^I!*Pff5a9hpi^lEspqLXAf6j*We;+Q0ieU z0<FwOFNi>y_%6uhkb(%bO;uB?2vnZmVh439K%EJ2)0_>|G*2u6_cd>^l$K=XK=#<O z$Hyn;<iy8=2OoUE-4IAbtph~`$YyXEbBirMDJwO(1bnyxq}jg-qyW?#1F!gp46}jT z8le6Pcxh)*KS;@B5HS%%fF_l|<6E~FJ&TrsM3#dHP_G@_&4+XcH-p4LO>1z2p$J^t zfMOjS*G0!bvLIh0g#<XQfRf2A4jag+Sau*?#h{f6EKD4X9H1=?Oe~Bb$ic+LEWj#Y zD3HR%%3;gGETF={Ef5ab@PHse?G^zR7+-*yi<v`@qX;xghghz_!NMUWz%L*P8s+0) Y;Sd$z6krih0d0feV`O9GV&-8602nX<hX4Qo literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20958a337236eb7389043e6418ca5cf67d90546b GIT binary patch literal 25370 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93791cc292e43c0517d7b5715b3cca7d82f9717c GIT binary patch literal 492 zcmZ?b<>g{vU|`Vf?~D;*WMFs<;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCQ~9eBLjnP zeoARhYOz9cenDnxib7gZey&15Wl2VUo`SJLaY<rcN@7upLQZB<QDRYMYO#(&T7Hp2 zW?o5ZQC?z>LTPcTLVjLOr5+cTXI@HXS!POUVva&`PGWI!YOz9MUW!6mX<l+kW`16= zLSj*>LRx-lUW!6yo<fR|UVKtwa&|#}QHfq|W^uBff`VsWNorn7Y6@3rabkL^LT0f- zNxnj2PI+Qwu|j4pNTotaMrK}mu|jTUadBo|I>fccdWH~2Nk(FcLN3@pRthB<sa#2= znK>o8nR)ufB`G<XNecN%S*gh-#R}z_IXMbRsUX*<C}gHVT&2h5r^$GWJw84qKRG^r zB|{Mt0|SKkRjpr8lv$QolB!>pSfrnppOcbWRIG1gtZ!^)W>#)dVrgES7oTEblxvw{ zX=-9@T5e!qV31y*AEIB7S)iMlS6q^qlcQ^4kei*6ZIlBN1mpO!)V!4ZBK?%i;*y-q hBz<^*=*P!r=4F<|$LkeT-r}%<c*%|p6oa5B1ptM`n}7fS literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..929b886d659ffc9cccca4b94244d2c694b7714c4 GIT binary patch literal 1089 zcmZ?b<>g{vU|`Vf?~FOk%)sy%#DQTB1_lNP1_p-WH4F?4DGX5zDU2yhIgC+^V45k4 zDTO(OC51JeIf}VbAcZl7Er%tSHHwvyA)Fykj)ftWEt{*zhmipUQ+QH1QkYv9qgW#u z@|YqRDmhZwqu9e4@-$c&QaQ4@it0eB7(q60=5Xe6MR74Qq;RFMv@k@mLv?VaGG=i{ zafdVH$*?e_@?>)rEraUePGN0fh~kE*OJNFT(B!SscS=moF32w`DOO0!FH*?NOUW$D zOesywQAo~7EG|whR!GcCQAjJzOD@UG&nwn@3G%exEy3i(<c!q#w4(gn_~QK1qU6+D z9Lb3}If+R*skb=Nic|BF^HWka8H<=07#Kp5K_o~cGXnzyi0uptEfEF=h8o5qjugfM zt`w$PrW%GCCUJ&f22EzaTa3xK81q*$Xfj8!7gWZlW#**bVoga+Doww|oLW&*#LmFL z049Ew>lYMdmL-;?>X#)J>8IuAq@)%V>l+#C8=IM#m0OfpniuEAr&t)}TBcZ<ni!jw z8yFZEq!;Li=oe%b=w{{>mn7!o=vo-$W@ls@<$wgiIKC`3FD1W7KP9ucBquXTKRyW> zO!~Q*#mRaFm0*tvg1o^3@)#ozqbB1m4rgc(Br}2p85kHqG|1Cn4}(%r2}2D-31c%T z@EQFynQn1q7K0s;mz-L}4N72)x0v&jvcR5$5FlMeATy*vwt+&Aff2=gkORQx+b}RN zz|1e=t6>O+@R*vJiqvWt7BH8vEMQ&8u#hpBp@c1kv4p*bp_ws@LyV!Bv57GS6!1)b zRnn;y1*yp;3Q3hEsl^KUMGD0wMLG(3`6UXf#hRQ&JPZsBw^+fFx0s7dif*w%V)_<y zab@u>(e%_3P+S#P7MG;vf@L!E(r<BwR2HPV78T_e-C`-JEJ(e@5g(tIn420O4+=Ao z1`rS8TX4*Ry$te}63ELSI~f?c7+Dy(82Ol37&RF~G<k2a$H%ASC&$O%V#+Tr0!0K! zBrzu^KK>SSW^MsEer|Dl=7Q2T*lutb-s1F2%!RszJ2^imCl!*e!C_wnvho(6V@XL- zW>RShL>ZE^;BLFcVUwGmQks)$#|Cns0s{jB3lj$;2NM@F6QcklAEN*(6C(#BA0rPF K9}5%6*^B`2<Odo6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab3c576e80c71c7a15e58b32c046b2e2af3e5b5a GIT binary patch literal 21405 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 MSBM!h|I5J+01t>8PXGV_ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b85c1cdf638311138ea590a92a6ee69b03018acc GIT binary patch literal 15870 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 YAr6ju1{MxZj(P@V4i*k}4sI?+0KOQ$s{jB1 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf13344d0922371018fcf97aeaf9574ef3e55e5b GIT binary patch literal 62735 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 Zw?I7upFlkW42mJKL1G~SS{&Rgi~vwLQZxVn literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.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, collections.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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- 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) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[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'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# 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("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > 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("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- 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 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<prefix>[a-z]+)://(?P<suffix>.*)$') + + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..b13cdac --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- 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 '<Distribution %s (%s)%s>' % (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('METADATA') + 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() + self.modules = data.splitlines() + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + 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 '<EggInfoDistribution %r %s at %r>' % ( + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- 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.python.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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..5c655c3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1295 @@ +# -*- 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.python.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.python.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 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 + 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<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", 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('<a href=[^>]*>([^<]+)<') + + 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.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' + r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') + +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- 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 <pattern1> <pattern2> ...' % 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 <dir> <pattern1> <pattern2> ...' % 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 <dir_pattern>' % 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'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': 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, + '<=': 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..77eed7f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1094 @@ +# -*- 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, and 2.0 experimental). +""" +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' occurs wrongly in the metadata. Include +# it in the tuple literal below to allow it (for now) +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') + +_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' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_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 and 1.2 (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) + # 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). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = 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', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + '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 + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + 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: other fields such as contacts + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..8e22cb9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,417 @@ +# -*- 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 = ''' +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%s" + type="win32"/> + + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly>'''.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 -*- +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +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 + + +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') + + 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 + executable = os.path.normcase(executable) + # 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, + 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, sys.version[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s' % (name, sys.version[:3])) + 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] + result = finder(distlib_package).find(name).bytes + return result + + # 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de GIT binary patch literal 92672 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�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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..9da9b40de922fb203df6b9a1d0ad4139af536850 GIT binary patch literal 102400 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 a;)=x$i#rxiSUh7fC}2kMXb23h5C8y3xyt<j literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..9d4bfd3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,1756 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={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 '<ExportEntry %s = %s:%s %s>' % (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<name>(\w|[-.+])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\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.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + 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<name>[\w .-]+)\s*' + r'\(\s*(?P<ver>[^\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) + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..732215a9d34ccb7b417d637a7646d9b843ecafa8 GIT binary patch literal 89088 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%0Af}9)KdZ08U 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ÐrVn&$$|uYl$n!E;<t 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876 GIT binary patch literal 99328 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..b04bfae --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,988 @@ +# -*- 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 base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\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, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, 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 for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + 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)) + + # 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 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, 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') + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + 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' % 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'), + sys.version[:3]) + 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, 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') + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + 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, 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 = not path.endswith(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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distro.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..aa4defc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1197 @@ +# 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 a renewed alternative implementation 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.7 is expected to remove it +altogether. Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +Still, there are many cases in which access to OS distribution information +is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ 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 = {} + +#: 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 = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: 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' +) + + +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 + ============== ========================================= + + 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 "<name>" 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 "<name>" field of the distro release file, appended + with the value of the pretty version ("<version_id>" and "<codename>" + 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 "<version_id>" 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 + <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. + """ + 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 "<codename>" 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_name`` (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 = u'{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`. + """ + return self.os_release_attr('codename') \ + or 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`. + """ + + 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) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + if k == 'VERSION': + # this handles cases in which the codename is in + # the `(CODENAME)` (rhel, centos, fedora) format + # or in the `, CODENAME` format (Ubuntu). + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + else: + props['codename'] = '' + else: + # Ignore any tokens that are not variable assignments + pass + 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 = stdout.decode(sys.getfilesystemencoding()).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 = stdout.decode(sys.getfilesystemencoding()).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 + + @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 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) + 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. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +<https://whatwg.org/html>`_. 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.0.1" diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57211a01da6417900b5c7a7f2f9baec2ffb639c1 GIT binary patch literal 1321 zcmZ?b<>g{vU|`Vf?~LhUVPJR+;=nK)0|SEt0|P^G1_J{_3PTh_3S$aW4r4A;6jLs9 z6mu?16bmCm3Udle4r?x36k9HP6nid56bD$0HHR~oD~b!uX3OEu<%!|}v)OZabNQn9 z7#UJHQaDq%Qn*uiQh3wZqWDwzq6AX-gBdgh64x*>FmQQ<`1&XmBo-BC=A|p-WF{3Q z7F8-FB^IZqDCFlUlw_nTB!qi7hJ?E-fK?V3q$X#kWhN(<Waj5_*<_TI6ck(O>z8LF zmXxRK<rk&vXO!gT*d@g4DTHLCf(=eBQphY;NJ%ZuOwUVAQ7Fk*NJ>>m&d)7KEXhpD zNmVG%EXm+Xt;j4c0XYF|OIm(uUW!5{#QyTkoD_vb5I?sdCp9-UucTO^JT)grHzhSK z6J%m)QBi)8LQ!gRepzZ!r9w$YVhLAfu|iH_QF>}lCAw7#x%nxnMR_0xWtZd^D3qrr zDI^u;mlvlN73*<vxmF~CtWhW}PE1d=vf|=WP*6}vE6UGRD99|(i!V#fOUW-%$jmLs zFDg+0`PDQhGYPB+<PU}Xg48?>rQFK+l>FpUkX!XYYLs*ol!}s+G!+ty71FH0szJt< z6s4vr*uqWG14TosMw%uUms@_3LUMjyS!!NpYF=`xjzURBW--X+r8%hzMX9=}6(IYI z!SR!ppOcec4hp-x#N5<kD=scA1*^2uykx6{I<W1gU~`Kg#wXyFbt_6t2e}%oDmf>y zxES3KQ2YcW78R!!fz`n50eK~<G&3g!6pHDoB_TzrsZJ0+hPv{^oNOdz;b1O`s^Zk5 z%*33`s?;JqI5UCkB`CvaGT-7)Oe)ULDJ@BjheX3Ij+D%@%;L=ayjudLd6~)iDXH-} znI)-3i8;kD89}*@`4%{xL)?9f6&xP7c)=9R$C`|{_)y)g$#{zwDgtq$CgUwmxO0j? zxweR%fq|ij14M9w2v8m`;$~oAsA4tLGte{i(-geL9uG<j@$t8~;^WgwOG=AU<Kv5% zK&qKR1PcQL!!2%5B7sH|n!&etkb|}eWX&yZkPtK!i$HeX;zGC!Y(L1>#GIV?_*>lZ z@nxw+pumZbU&&A;0<sfC{3_BfD9S8LEJ@WbODxh)%LhlDzLBxMv6-1!xkZVkd2wER ziiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_Nn%cpu7yEvc1E^Q4oDD;p*aLx41ltR vetdjpUS>&ryk0@&Ee@O9{FKt1R69{naVNmQz`(*J!X(1T1A<H(j2tWgV#%HJ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e2f2fd37d9063b174bfa2b7c0ef3c7995b55352 GIT binary patch literal 13768 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4504630dce636ce235a23227d197ba2f50f68242 GIT binary patch literal 22659 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�N3~&%p6R7 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cd1dceed429511a9bf4ba5bcf626d79a296c6d8 GIT binary patch literal 41560 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ĵ#ECDl{NFOFuw&mVycmR?s2Pj0|~qptZUayp4JaT&F|&pOD?A z=<DRUP>T^*JqNCFL1QV~K#TqsaFlR@TDU1F#R#g-6dp){kr!6OSi+snQFISQCofU~ z1lrEbk_S3v0K;~0n}fH6FNLp}v4qKq0jVGY-?;!iK?hXLYO+Gg2yhyJSAa$HK+z7a zfelLY;I$lRH!}E09MI4Tu38bf%ZFBafg810s$^IlT%~}cRLjeUB-Ub04#)vgAgAMY zI4IwQV2;gzMoqxgDx_=!*Mx)%xFXQJFup2s0RsaAI|~CtF=F5xR?0zWL`jDz@uV0< z7^~2>6`+=QD0Mwb>V|Jd17%KdTtk;GfqP<z)D7zAfVS1@)i6N!O@q(2%VsJ9o%;Z4 zowDS`f%{(^MJ1s2=mO3XE{t<P7#5&zp@%GO;()7VLs{B{Pz%msDWG$fIsA}D3&4p= z1u0Rv`n&0ZYa;aK6>>tV(n8XKNQPMTVeX<XLc}~c(!u=_aPtQ(`avx!g3A#>p{@Xm zZ%|JiG8qesXBY-GhIkl3OG!cf5e`Q5BMQN8hWA7ewJ!E31}$Yqj$-hXh*}D0of%UK zvkgNH1Lz=gMh0+1vSf1<fu`&cEf(aq4*H&HF1#Ci5K}3j4mVc{Q!s-jG$KQaK!<ri zS})2-@qⓈ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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc62ed0e799258f30d97d49a164dc81ea1d90752 GIT binary patch literal 3313 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..379318088801c57a5322077c7d663834c701c1c7 GIT binary patch literal 66225 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e2f3e3855fd373983a12c729898cc9d1f2b8c12 GIT binary patch literal 97822 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%0D{J**&$=o;M*J- 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 J&cMjU4glIo)wlov literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..846c025029c385cdc30f83b0eda055811725d648 GIT binary patch literal 10838 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�%w>W}9lS?6q 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 T;$h~H<6`EL6{u&ZXD|c+=tuk| literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +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", 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", 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# 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 = set([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 None: + 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: # pylint:disable=bare-except + 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 overriden, we've been overriden + 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""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + 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""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +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): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + 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, binary_type): + 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +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) + + +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["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 <!-- or --> 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 <!-- or --> 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.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif 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": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif 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.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif 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.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif 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.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + 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 scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + 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.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": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif 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.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(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.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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8cd2ffbf38b8da9ec28a156bdba59a4eeeaff73 GIT binary patch literal 434 zcmZ?b<>g{vU|`Vf?~GAoWMFs<;=nKm0|SEt0|P^G5Ca243PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6dNN$Dq9q5r2trjJ(o3#gOMSeAy0&bA(b<mtH^_q0R$r%^4KC6 zQaPenQ&@r-G+AGQY|>=D#h;i|oS#!#k{X|xTaaH=a*HD+vn;bXGe7T^KxtlPa(+r` zd`@ObYEfcN@k>UKa~W^3gcN0_`e}0A;);(?D=jH4N{x>%Vq#!mC}IW?EDQ_`x0nhl zi`YO6wtz~I@+h{H#FC=S)F?I=M-cxOw<p*>*P^2QqLmCq+#sDG;#Y-!K~ZK|Vo9og zSz?iXT7FJSYEiMik+Ht9nVDI+MTw<(abA3ig;B0$ilwQEv1z%1fq_AKfqsa7L1uw& zW?pegVor{(g+Xq1Mz&E7NDz$U%Tn`F@{9B{N^)~db25|k<3Y~RkB`sH%PfhH*DI*J j#bJ}1pHiBWY6tRXF&_g1g9sB36ALpFqW~ixBO4O{bpCQY literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39615fd51a5640c948d7e5d2a029241c823bae04 GIT binary patch literal 1517 zcmZ?b<>g{vU|`Vf?~GZ*%)sy%#DQTJ1_lNP1_p*=69xu`6owSW9EM!RD8^i-D5hNI zC}u{G7*h^QE^8DkBZE6b3Udle3quM^Dr+-y6k7^wFoP!BOORQb%(wUxlZx|mN=s7X zGjj{_i%M>Bq-2(57H8(?-4ZCx%S_HsNsZ6REJ-a&%qiAnyv6RDSWu9em!1sL4#Obl zfY`-W3=9mZ3{i|J3{gxej8V)f-0ci$j9}|IqgYZ{Q`lM<qF7VdQ#e`}qS#V6Q@C0f zqS)IRSQw%>f*CY<Zn1<EWu{iiIwlpD6eT8?C?q8orz#}pBo-Gdq~#YWloVyA7W*YL zfh=QSU|>eV#Rd!v3?&RDj5Q3+ObeJ6GSo74Fr+YKa}>#yFxN0OGX^t&-NKl{)WT82 z<iY?F(PZ{ZW`r6BGL)5pfk7A)u2KvP3>geH46#DBj5Ul47&;ghG8VDaFiv7BWC><i z$)L%2i>tUKv8bfDJhLQ2lj#<dp201~3QfjaYz0NBX_*y8><kPHze@EBiZaU*OH%dA z5{vZH@^eyBi;DG)jP;Gp%*@IyN-WKb^Wsx1jB+hgEKN;}P0I}o3=Gl>^h5LuG7EGw z^NLFnb8>Vo405wGvW;>;f?yn9mYSE6U!<Q=lAB|ilbNI+4+<Flcu;8R6;%G>v?)$4 zNzTtLuoD1z2IMm~hAJ6Q*y?4cRu=2o<m4wO<`moM!4+z<++r;*El4dYVq;)nxWxie zc8j?<wM3Ko7E5tzPFfK+0|P@5KPW{q-r|gp2S-YLye1<=f(Itc39^v`6sAmkOdO0H zOjVq4dr=||lxUnmid7gG7%Jpy7#1)rWN-n6I8zPN0>&D~g^Wd9DU87kg<RnbDNMl( zn#_J7ZkkMBHxz+v&}1$W1X&Am*)8Vm)JkxmLkN(2Zi!?h7RQ5p5)X={cu33$f$Rin zXJF)G<N`TR66`>1YOy;wgn@yfhOvero2`hahB26-!m5NJg|UROhOwD3g;AWLnaPDA zR;8AyhB1YqhKZY@l}VBTtXctCB$%O4A)KLv38bruF@+(RL6gbvB`7s>&k?O3X`7 zy~Ui9ns<xCJGIias3^Y(#lMW15RZb=SrOQ`d^!1f>8ZsfP=88-{0Wj^VB}zAVUl1J zViaPk5(fJfRV9iqL3s)sEn*;FGAv*KMMN!A4O0z64U;588Ym(d{WKYiKv@LEMeI3{ z07iG0Fsg0wnI);Y${@#qQUC)Z7h{zK7Ds`VX)^k0a^B*IkIzfYO^uJg#T6f)o1ape z17h>U#}}3+=0IiG<Kt8EljGwdsY3*mEI<w{k^!Y=UTAVnPR+@Qk4Lyqld%Yt8o<E^ zPWPa+UkoaCK_SM+$-&OS1s3<yWCz)uR$5Y8lo}sj1j<oGppYs8`Qa9Ka(+%uYH~?t jeqM1As0;yXLf8Xgf#Tv8hYiF7cA$tZ2I&@I;$a2=shwV4 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74ea6645366f4c3a11e2298916a059d5b31c3c8b GIT binary patch literal 2036 zcmZ?b<>g{vU|`Vf?~Iwn!octt#DQTJ1_lNP1_p*=9|i`76owSW9EM!RD8^i-D5hNI zC}u{G7*h^QE^8DUn9ZESp34!%!N`!plERe3nadi*#mL~!kiwe6*20j&mde%49L1W# z9?YQ0@e*W*Ci5-+#H8Z<oYIoi_{`jb{GyUu94VP)nZ=p;dA9^g^D>k3Q&Qt|GD}j6 z5_5_*8E>(K6lJDrGT!1WNv$Y}FR3g@eaXncz>o|w4ThOvt`1{hU`S<%VoYI(VoG65 zVQOKBVoqUBVQFEAVu82`<eC(Y7KSLc6wVZ`7KSMH6p<936y6rbD2^1q6#f>5D9#jt z6u}mTD6SNt6yX+zDDD*QU<OUmB36*KOi(-77#J8p0?weoDq~<^C}C)3sAa0Ks$pEf zxRAkxAy%)JxrC{PxrDiysaUOqC55q>v5B!ltcKZzA(pR}rG{w%YYodnMn;B0op6Ri zfpCTrwiKoX>@`da8Jihv7~(l9<Z2ifaDvSeieai{u4S!ZtzpRGsA0BYD2xebNMQ(O z&}8<jl5ot)QOHiMELO-ZEiO?=N>wN>Day=CFTTZ~$#sjlIJM*!3rPAFS7vc$UU5lc zUUF&?$o;oCLn;eWU5kqHi*7L|rlj0rb8!TP_AQpI{LH*ttnn#{C5g9KGfPr)i#6G9 zu@tA~q}^hH2qtGF78T!O&Q7ho#R6jAVl7L|DNS9;P$a>?!0@X~zo00yEU_e2zbvsx zKP^8eCAFwn-^f_s*v!nV+@i$Nyf`mD#lk4pGR4x=#Mrdlz`(#Dy+A)izaX<f7wpQM z99;{8-0X~Oqa2VR7{`~T=B4Bp>1UMW=9uPWCh5nQ6lJFBrzC<Xy@JYH9P#m)d6^~g z@t`DLECh-yMm9!1MlMDUMlMDnCILnv#wuQrC-q<|lVMQ`qCprOr6Bz^j5Q2d4B2eK z44RC7nv6vPpj^XL1TwWqlz{=_Rj_}HBpDbOZt=v&C+FvtBxdFn$H$9-5(daP2F5Bu zsD%jGWKbFgyN-c@0i+6UX$eCOLl$E*Bg9gsTg*ABc@Uc!AvS};7s*og`1qXEy!d#K z3yMJ|F)&u~K<xudpjZX67Rjn+h9*XEG6MPUmat!biDzy>PHJvyUP)>SIALgFw-pr5 zC8<U6@iIu>goi6w22Z#$WHHn*N`jIv$X<x=@PsROe0+Lp2`CxH$IBzxCjj*(T+$E4 zPEe@;_A3tq11L}#7BJQ@E`$Xv*w!LYG;2bvzQtBhl$w@V0SQ}hD1*WjtV9XPR!*?3 zpbSN-ZMQ@+5{u(OI^)YTOETgi_Cc*LQp8MAMId`sk?fWP+l|c>lHJ0Wlb@HKT3kYe zE0h@+7&MSvAq;i}s(zB~7e>_|4~kxVL7~FHz@Uxf2nj5XfEdE)r^y2<2=WqhQ{&@r zamB~y=BJeAfY?0o@r9*{IS`p5DNu+@g9up=0ZLj$3Lq9JRe;032;}u5kkv@30+BR8 z6#ys5O`sxygOP)WgBb$3z%;nV@YCc5IU%jIq_ikCKE4Q)MT<a5vj|kzMzKN4F0j%f zK2RybUyxa#2QBFIiZd%9MKx=DQetuHEp|sIXOPFSIp-FK4aB2%pj=+e!N9;E!o<VK I!^Fc30IQ?Cga7~l literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da21480f742bb4861441072b65d3e618d88b29ff GIT binary patch literal 2239 zcmZ?b<>g{vU|`Vf?~HlR#=!6x#DQTJ1_lNP1_p*=9|i`76owSW9EM!RD8^i-D5hNI zC}u{G7*h^QE^8Dkn9ZESmdhT+&d89$lERw9k;@sy#mL~!kiwS2-olW=p32qC9L1T! z5zL^;`4VJ@Ci5-+#H8Z<oYIoi_{`jb{GyUu94VP)nZ=p;dA9^g^D>k3Q&Qt|GD}j6 z5_5_*8E<ixq*j!~msA#{YBJv9PRcA!O)iPgNlhzx$q4cU<1LnuqRiA}kl`@Q4D*B= z0|P@ULlk2QLljdAV+vCXLlkoga|%lfLljF2YYJNnLlkQYdkRMjLlj#IX9`yfLlk?8 zKnhO^Zwq4-M+#pGe+xqtX9{;PgQj2+2Ll5`G85De5Df||XHZyqF)%QcFhDG*VO+qt zkimtanX#F%SgwRAg}IrriLr*Uh9RE0gasno4C1k-u+%Wbv!$?>u-7m)Go~@sFvN4D zFa$GbviT*0yauufW=%238VLplh8l)gfm+5Ah8o5a#%88421bTLCa@+(KTW1vT$#n0 zdBr7(dC93otf0_gy2YetaEq~GB|{Mp0|UdaBK?A*%(BFiRQ<BVBK@@doRrj}VtpfH zePc5-vvP|POY`Eq_!JAHT+0+oQxjv;asvYcgY*LZ5dDJ80$s4#IXSu(2D#Z8*+w}a zK`@RlOU+BkFVfE_$;~m%$xPCZFDc4Q)i0>jE2#X%X_KCsms(L!WXBEi1;k5L3ZPii zi;vID%PfhH*R#pVPfpA!w$p<vu99%f$x+Bott?i^EiEolNJ>>GE-A{)OE12~Py`Ae zP0m})i8(p9SU_rSafVbDq`DRr<rm#zjZaA|Nxa2YoL^LunsSRZ9-<&VIWajSwYa3{ z7IRK&-Yp&ozaT#|ucTO$=@v_IYEIfM7LZnOSV0J01_p*(9582s@=Y-)AQ>3N7&(~O z82K347^`?uyn>QMK%NCB5s*$$BFJLMW(#J}Wc1TyED{FCP?03a3g+z8N{Edh<BP!7 z^2Em{=jW9qX66;g$Ac6XgN$QftP+G;h>(RR7*N1~RKYDRVW?rqVr*uFSjto+&cMI` zv6&HUGrFbh@$osSdGYaLu()Ditm1*%2bLh(s#`3eOpMPiP`H+)7RASdf&k_@cxZxU z@PsBq7DElABq+n6hh~us$dllJ1QX!U<c^O|Pc6wTNzILq2g$?i6M%XSF6jrilbwNq z0hEovfw>Ko`xsLgvN?*yY8X=(vzdy;Y8bK@iWN#2K{P0cYZw<W)i7i+FJvt8sbR=s ziD9Z`s%0)=1<BVi)-csDH?y!X)UwpF<_W+=o0%XYC5+7swQMykC2Szo&5YShMI|+C z!3-5TAbt(2B*Oxx8pef;MGI=!7O=y_7BVt2)Uc*7nKRU~7M6uGfYMkza}7%kE4V;m z0hyr5>{rAO3K5WhG&zby!3nN7wd598aY<rPNpX2*Nk$PU!izvfOc5JMEhwGbVopp+ z(PRgwlUr;BMX70-6}Omj@^3L^WZq&0>%GO8StJNj4-RNB0Saxfm^>&6$$^S7MlnV% zCLTsEMlmJ<aIRrt5@Hl!<Y8iC<YKDg1jhg<lfpwD6zU)h4*3*t$b)>G%~r&h!Whf| zDn@G<vX~Y!7MX#<8ye0mH4Is-uyC$r$>S-3iZnCTvOq(Y6&$i5DNMnjjKNyNBFV6T z5frY$44TY-A#R%N;1pY=4Du9On1BKfoPji1!C_LQ3R0v7BGf^ICWrus0hj;<#4VAG z#A0v(6b}mJct{|cfkH+I95P&tEZ~q4V&Y-qV`O2fk_3kaHeH}ng9}s`<t65(#>d~{ zijU9DPbtj-v3cU-3riDoATmYLAcx3;2vG1BDS%jtAOaj!S|AqKg$M%V)*?_1#|d&8 z9|Hpe2O|e32Qvh6iG$_*G`T^Rrj?eI7Ny3=7l8_zB2Z;p1gZ*e@fTzk=s~Ljz2eLY za20fm4N_%;Q`Ifj_@u<*RIp*U*d3jmL4HLlfxzwoIpr3I4a949paQKJ<S-FN9wr_p G9%cZ|v*^qK literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +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: # pylint:disable=bare-except + 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=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _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) + + +# 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +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 = dict([((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 = dict([(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 = dict([(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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24ba5af4966a40fd5365552c4402fd5e570f8bdd GIT binary patch literal 209 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKRr&=* znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI($6T#%`wf%Owv!w%qanx93P*V bmst`YuUAlci^C>2KczG$)ehvQVvxH5s{J;s literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..262eceeb90393ebd74a2175556c4deb48f8ff773 GIT binary patch literal 1325 zcmZ?b<>g{vU|`Vf?~Iww%)sy%#DQTJ1_lNP1_p*=F9rsN6owSW9EM!RD8^i-D5hNI zC}u{66s8pB9F|<xC{{+0JWCE+E_)O^BSQ*n3R??96o)%Q3VRAi3quM=Dr**JGjkMY z3TH5bCf7@l4Vuii_!E<g^K(i|QsXmo3-XIfZgHe!mSq-a=I7lKD9y`E&QD2=&&e!F zElSKOe#r=OCgUxZq{QM>O~zZ?{zWONMX4z+naL%|AUTkkAexzhfx#K%Y8eIwh8l(x zMoBO(;7ehG@|YzV(wKr7G+C;C2Bnsi7Ud}<<|!l=6cptb6lErsq$*^mRw|_B7lDOK zN{TX*N=s6~0>$}7C7F5YTwDqY3JQ)esbYnU#IjU{M1{P>+|=TN#N<?kl8nR>h2+FM zg``x4)Xb8M)FOq11i$>e)Pw{DkiiPYB}JKe>3Ry`sbI5`6Z6zd6q56E3lfV!x>FTO z%JUVHQj-%)i^2R#^`caTl+3iW)S}e95`~h=g4ALih2ngL@>GT7{JgT%q7tw{a9c|9 zLC#OjEhwpkTBeYeSyWu22XTB6D5!2R6tOZeFsx+IWW2?aSW;3{#L2+G049EQ=ob`a zmL-;?>X#)J>8IuAq@)%V>l+#C8=IM#m0OfpniuEAr&t)}TBcZ<ni!jw8yFZEq!;Li z=oe%b=w{{>mn7!o=vo-$W@ls@<$wgiIKC`3FD1W7Kcgf!$22E1Nk1(!rvzkjVopIu zVp3{JW^!T<$SL4JFV-ulyu}$0;>TyFR&s!%l?fEl97Q|~3=GL2CJckb!Kqb(fq@~F zA&N1DA&M!5F^U<KN?RDBSW;Mm88lgMvAKb5tWt4=*;tiYtN^kCVkJ1DQ*%;tQ}arS z;VBCgP9O}jvN(l-fuSO<gdvM@0aFdbLPi&cSif4v8b)whW6EYL3M*l5W~gPV&?sT4 zVN79`WLUtukfDSvg{7Ctg&|fThN+ghmZgTJhN*_xhM~|ZoS}vZq|Sz+hB1tRk)e<; zoFRn)<XXR5ETE{?WV*!>T#{H+5|WsHi^CNZsUQ|hN@7W(CgUyU?9@t4_98Y=<nb~v zFx=vZj|XL&`1m4r5SI;<Zc|fkv1XQ}<`#p4PLuT(OL1yW+AY?S{Or`cTdbe}D89u4 zO2W5T%Mx=+Q^Dx~LU4mj7G_{z5Cz4604T^Ag&27l*%<j41sHi4IT)+>A;GE#v)NCR z732(%dGYbLxZ>k;^HWN5Qsd)q@x;d$mL}#vW!U56Q}UDJ<BLGXLu`X5!XmJ}ARmDw zi$UcP2O|q(5lF;OlM7^OT4_mXQEGgA5h(hLKzY9iq^t;(RKNjpi#s_#Cnq(zBr`v+ i7#tj6|AWoIX5B3g8;DEoKslrsWR3_E4-*eF2R8s<<65u) literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6a3381e8ff7ed132dc31ec7b49f20f75f596aa3 GIT binary patch literal 859 zcmZ?b<>g{vU|`Vf?~IXSWMFs<;=nKq0|SEt0|P^`1_J{_3PTEG4nr<u6k{$^6jLs9 z6f+}(J3|Un3UdoX3Uew;GjkMc3QI79ChJR(eof|E{E11$`8lN}sqvY)1^GoKw>VNV z%QA~I^Yd;Al;&k7=clB`=VX?o7A58sCxi6BFcZvP6$S=|RE8+V6ox3K6vh;$7KSM1 z6y_9`7KSL66xI~B7KSL+6!u^SO^#b^ZkahHsYS^ky&!WyGzdF`+z;|%4Py;MJVOdY zFoPzepC;oiw&MKKqU2Ofrduq<sX1vyYzzzxD;bJ77#J9SmFX80WtJtDr0SO?7U`$u z=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W?6_+ID z<mg%$<Ys4N8|8om!8pDwH7_N<NI#<_H^($5Gf6)U?B-(qq{QM>y@JYH9P#m)d6^~g z@vI<MgPhO6Sj7+VnI23onGxha1_lNY4N?R5VhKYHLl$E*BgBhLw^%@d3-*{MV-Y(8 z1H^Y=FBWk!Fff4aD@iSij|cg>7-SZzePB71AZ2D?U;x|4!@$4*v9E@)nF(eidwOa~ zVo6C6#8M`(rMFn}5_3}_wu0<|Sj`<D4^<l<&yD0;A-Heh(tet3AeVwniI2a<6(66Q zpHiBW8Xtd)CqBNgG%*JvQv{0TB9Oa^_)+}|x3vfquAo$142o?IMh<2UX0RB@3a<G0 yw9=B&qSW~KB2Z8if&5woQhkdpKPf9Uxdf~f$s=%cZ*kZ_+++ue6L3I^FarP<`M?zb literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b4551cff6e7cd9e7ef214436576bf08eab2c34d GIT binary patch literal 1879 zcmZ?b<>g{vU|`Vf?~G~WW?*;>;=nKq0|SEt0|P^`83O}D3PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6e}ZxJ3|Uf3Tq2P3TrBB7F#oO6k7^gFoP!hOOR=r%(wUxlZx|m zN=s7XGjj{_i%M>Bq-2(57H8(?-4ZCx%S_HsNsZ6REJ-a&%qf1!2yznREtaIj;?!i2 z0Wi!2bCLoB14Al96k`fQ6jKUg6f?*vEeugC5JyC@LM*?<=9ZaLl3G+{>zS98np{$> zkdR=Ln_7~nkercNRGeC3>+0w1@8ap_ZkLdtP?DIgkeOGKuaJ?Nn4*xMrjU}KT$-Dj zSCY&OwI4)-Ld6*rDiRC~3?&R%j0>1*7-|?7GBGmLFx4=`Gp8^HGiWkZl{gorCYGcY zD<mpF9Kpq<00mZwMd=E~`K3k4sa6Ul8L3dVLP>shYMw%INl|KIE}H7pyyX0p%)E4n zdKgckBwwL8wFIHoPm`sHje&uoh@F9f;TA`Hd}dx|Nqqb*4ww#2=36YqsX1x4*dX>7 zaWXJ4tYj$SVPIhR)v8}mlv$QolB!>pSfrnppOcbWRIG1gtZ!^)W>#)dVrgES7oTEb zlxvw{X=-9@T5e!qV31y*AEIB7S)iMlS6q^qlcQ^4kei*6ZIlBN1mpO!)V!4ZBK?e# z+#J)K%q0CZaHJILXM!Uo9uy(*&<N2hs4U`OU|;~@Vo*>saPTo!@k2sT59Xg_PyzwP z2`KS`{0mAX#rGH)7*ZH(8EY7_7*ZIrIck~G8ETm)FjgEXVa#G$z+A(ykkN%<0%Po^ zT9z7?6edZATGkrY6y|KEqJSEf6c$N_1uP30QdqN@ihNSoY8fXm=4I8erm$x-O<+V( z!I8~W^e=_8maXDm4ND4_B*OyMg$ynXv0*VxF-*1WwH&paHS8%2*_=gF3Tp~$YB<2= za%VFY?E<+CqNj$vh9iy1h9QNgmMMS%q$-6so2jU#h7+us55!L4sbwpy31_HbEBced z57CzmVhe!G5o3Uer0_#b$wTwS1jeFWHB1v2i+80kr?5iR3eI5;V_;-RVNc;m5dxW# z$(RBY6HZ}G5t+jTmglKuDpbk?`Cl09|6Qmd1U8!)LM~uS5nad#(gn6{1~#)RBx*pa zH`FjAR8L?moD~lCe~MTwV+~^p8`!1`HOvdxYgiUCGBOk@)v$ofEmR6;NMQ(O&=mKJ z;wUIejR)n>TP!7&1*x|<f=d#MN<tFTZ?WVh=BD0a0m((NXXZf^ak%CdlvIMHLFvrx z7E4NEN#ZSbXnG5&;>su~DbP(VEX^#d;z`cWD@n~O(FK{T$>ev79V$>IT9R5(0#3o! z@Ula-Sd+Pk50u*kK!gaW&|>l{5(Q;FHrKqAki>LNCL{%*L>t9fkY8K^cA6#!IP;<9 z*OJtt`1o6_Ir-(OMYmWpOHy--Z!s6-7u;e?EGS6LOVQ*i0wwxeti>gXC8<$dAWy}o z<(KBA++qjGXXd5fVg(l@V4I_)GZKsAL0*gpdodpBp?HuFZ*hV`thgXCIkgDng<Gs; zi8-aI;KBex@Pa%BD(HkkC0+z5%Q3Praxt<ni7|38axe-oaxif*3NW!SN-=UUvM};6 z3Nf-UvM`D;axe)n3Nf-VNieZ6@-eb73NZ43WSF=ZC75^^*}x(k5Y<dvj66)pc^n)D zewu8c0u1EB`1o5~@$tF&DWy57@$t8K;^PZT6LX+4?D6p_`N{F|;9{c)<W`8&K_wc5 z1@;7}Km?T(#UKLYR1R)%A?c^d4l+Egw4}5sH9o!wRKpa3%K0Kt>2r$#5j_yYP>sFC SVFPiN9Vl|a1(paC4>JI!72zxZ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d7f48f7c00cb289b645724e93174406a1dd91f7 GIT binary patch literal 2643 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 RCc?zS#KS1S#KXwN3;-NhzGnac literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..495a4a1cf4c961b754faf3923d4a8d27983783e6 GIT binary patch literal 2770 zcmZ?b<>g{vU|`Vf?~IAjWMFs<;=nKq0|SEt0|P^`83O}D3PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6e}ZxJ3|Uf3Tq2P3TrBB7F#oO6k7^gFoP!hOOR=r%(wUxlZx|m zN=s7XGjj{_i%M>Bq-2(57H8(?-4ZCx%S_HsNsZ6REJ-a&%qf1!2yznREtaIj;?!i2 z0Wi!2bCLlA14Al96k`fQ6jKUg6f?*vEeugC5JyC@rm&^3w=hJprEsKhwlGAor*H)` zXma0TbIZ&rNiC|<4oc0<FH0>}$S)|#%+E{AQ7B1FFIGq^%Fk6O$w*Zw$<I#BQz$Me zN=?j72Dt|008n^<Fvvy4KHxB6VW?%SWvbAsVaQ@|VTe_zWv*dNVaVnz(x_poVXR?J zV-90rWT;`RWvXGWWh@j3XMoCkfaFscAo3{;!3>&=ewvK8*oyN@i;`0{S#Gfur{<(Z zaTXM%mSyIb78@d%Mz>hO&RfY)#Ld9K@T*S0peVB}u_RT$EU`#GEk7qEwWwI%$XMUl z%*?FZqQug?I4?fM!YJ1=#nRNo*tFchz`!8AKtDvkAhSR>Gq1QLF(*gY!XP(0Bikqk zBnZawWvO{7`9=B}CAm4KIhjfNY2ctM)`tZdD8%#%DsQnB=VYd&7IA=5iU25_7&#bu zz?g-RgOP)=iWd^-dJuK+;ACZBU|?flU;qba2?GN|MP3cV0)~a4fJ};E1_f*_a}84p zqa;HuOASj3Q#MnPTMbhRvm`^YT@Awm#u}y+7D)zBFfU{-&Z%Jn1$7};4ND4ZHd9er z4Z{K^s0!wVOi1!jb>R%)U}y8Y#ZppPka~+FxFoTtBqTBY7E4NEN#ZS*yu{qpTWqd* zDItmJn#@JK3=9mn1T%}{Vg8RV25Gp(k1Uj$m!ip9#0gT$0gJjKP!7Arl9yUhQpCr= z0Esnl)D`i76~@Pd(tUiq5GVviz#%9C4ml1+Auuh#$iY;_4-G|_>SRz-1StlEBPd@u zgS6jcU|^_WF5;<S28CMzUkWJf7*m+C*@_fuSW=j?*@HnzkR_X`$O{}&Y(*xZj9SBz z!k*1kbgPCrg+r1dg(aIQm?3XM4Py#tHd9drSSMRi94Hsnu%vKjGZhs<Rq}vL1euVR zRKu9Uo6S@-3u^8Zs0u!iSs<Nx4mFG^{9s!kW?ZXbDmn#;VX*BWHpq5?Y__6PARSN> z1YstC#59Hcz`=Nn1(Y&1nQpN==jZ08=9S#y4=zYdPIb;mEJ{o+Ni8bA#gdVln4-y4 z#19T;*W7}V%8<nLkRnh(7YTv{S(5ToD&4>eG?{L(6(<*E7L?p#EiS3dNxj99oS&0k zlwVqKi#a(z=N4-TNU<h!krGHJYYE8kTdXB%`S~Tcm`aMkF$#-(_L9VOQ2Hqn1x2_R zh`<u{MZydW4Dz68GXX^;qW~iZGY2CF3kM@8=kPIduz^`DJWOni9IPBLnpuF6hmnPm zhlz!;N&=cHkP{&|T_!VwjAUS703{Q6@?c<MV5ng#;(-J@IC+3dEJ*TTMoJ!RMFBO; z;EZHb!<51X%4VQQs9^?0RDo9wa|%N?M=-+##=JE(j42%1Y(+g#^*IprATe-K10|pq zsJ<qcK2StXV9YD1VFV|pJvGcJJlSkTE1-ILv)O_fpnA5!^h{s`Cm_CTrlL1cyKX?$ z^CPK$hNNDghA~ATn{5JPkpe`=1V*sm*(4c2;xIcVFc!$bbmiTtVN4OsW}3iQ6jB2U z5s+>RkbB`K_(5$I%w`T|ND&HV$Xijvm?8|eXBu2p2~?E`*lmm{qF^&8KzucUv7irT zBgpK$v>L_~F|dkLa1*vcO%O$d`~=2=V=#SrMm3Bn;$U0<!1cU>>JbOq3XZJ_j0L}7 zdO&t*N<cD@CUcPlC}B#22w6~#%Ty!@VoQP8%(s|wGH-F@7nFdrK#?j)29%M&83&w& zG?{KOrIg%aN=YfwVqjo!yTw=l&1^+7AR}aMu_vaa6r~my-(pWJD#=XFNxj9ISe%)X zdW$P5CqFs6ur$9U^%e)HxJ@t0Ou5CDl9`y3pMHxuC9?=bl-*)V$+^XmmYJH9Qk+_H ziw%_5Qj2b}q~#ao-eSryyv3AZbc-p&_!d)!$t|V~(_2g#X1CZt88fx$7E?yiEtcHW zywY3Dd5LAWnDTRqv_UzSxu7WZ7JG4OGN|Ui#afb>l#_aksWj&n8>D2{WGZq8c~%4D z2c}z0MJ2bGiVBJp7#J8rG?|K&L2{rXK$8hv5)`Sx1i&m%pp>NCVk*gi6bLNf+Mq}c zqzGp@04nq&K;=LTDAU5q0WJ<k9wrfRDFCWZ1(-M(IoLTEdDx+1Od^b2>|9_qTr6CS zER0;tppt@%n~RZ$k&97?iH(tq4Jr>-C&XAKhNZkn%}epq<haEV9}g<B;^S{|#mDF7 zr<CTT#>d~{iH|QVP0WGHu*b)z<R{0+gKNVgage7#Wmpl&17QCm5unPgh#gwV7lSH6 zaB0TH!OLL@7WdO+2U(R?T2fk+8XsQ-Dy51*#a0oh%(}%;1Zo|CRU(-RYVttqO&f?K P?Lh6bVvrUQCLU%0h0B{s literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c5c46eed444b1c1a5b84adcdb1c0e423a2a0e94 GIT binary patch literal 16445 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f82221a3d660aecbc3046f4e12d66cc2fd589a2 GIT binary patch literal 1363 zcmZ?b<>g{vU|`Vf?~K{U!octt#DQTJ1_lNP1_p-WJO&1a6owSW9EM!RD8^i-D5hNI zC}u{G7*h^Q6iW(o3QG=aE?X2EBSQ*n3R@0)E=LqcE@u=cBSQ-N0<Kifg^W?0sVob) zQ#evN#TXVcM)9~aq;RHiwJ@Y`rLtx5HZw=@rf{e5v@k^Rr7#6EX!5=Uxk8iq7Jp(= zaehu|Noss%Zb5!g$t{kQ%(Bel%>2At0;PGG$@wX%@j00#sYQu7#eOdtL4IMp#gdd* zocfXp#9_L{SCpKRSd!?PlbV~FS5kb7zqlYVIn_BMu_!UQB(<pc7DE+lv}$pzb~4CH z7>0XZhk=11l_82Tg&~S5g)xdbl_iBKg*lxml{J;EnNggfnK6nzg(Zcxg&~R~g)Nvt zll>N(TV_s4YEhM=bAC=vVnK0gu|j!9W=Sg8VujR-<kW%^h0HvKf}&I%g_6{YlEk9a zL>-01ycC7v<f6=i5`|QlW0?zzQg3m<)Fgxa2XZ0Ebs!9Ka`6IC^f1;kR!l2l$YNZ; zRKu{4(S;$lt(K{VDTPUrp_aLZIfXf!smQ5@vDl)9DTPInp@t!gIhze6lEP}vP|KJX zP{W+Umd#WYQNswrDXbPCQL7rp;<6g%6!vVUqOuyM6b?y-qOufD5X*)kPo{>kcv1~> z3RgB$(WDX<kf<a>Gb4z$VW?pWV_;+`6bffZVF+f><n}89IsO()No7ImEso%l#G;ar z#PnM%d5O8HMXU@A47b=^^HM-U{K04u!~%-HUyKU3xDc_X$y&t5z`#(%4bsUG9}h|b z@$t7r!C@Rwlv<oxRF;Z}^JHjD#DnFFHCb-46sP8-MR62BmEK}4$<I#BE8=5dU|7je zB+bCU@T*3@peVB}u_RT$EU`#GEk7qEwWwI%$XMUl%*?FZqQug?I4?fM!YJ1=#nRNo z*tFchz`!8AKtDvkAhSR>Gq1QLF(*gY!XP(0BikqkBnZawWvO{7`9=B}CAm4KIhjfN zY2f5itdB?}dIgn5Vhjun0-)?C1&VP-7DgdP4n__}Ax17H9!4%E5hf5Vz*NN#No{(t zF!0mlyu}e84+_`#_*-1@@wxdar8%kb@wa&5;|og@bD%Qp@$o77$?@^GIMa&qt5Wld zQ%i2K<YX3?6mft8Rvbit+yD*>Btixx0Sa~=kmEp+z`@AED8dAe3U~?yMK&mfI)fB} zRF*I-U`%1GVOR*t-b{W)B9Pq46CB{^>>3;&<m&Dkaf`XQG)a^377HlBqgyG#z`&pi zG7Xfk85oN|d`*6k2h&PRN{dqC<BLEtMa&@gfvmp8RFql-D&D{;<rZghJ}5@=N{S&K z<OHQ0maP2Dyj$$a`MCv|IjKd;AiW^JflWtp0Vq8bfqZ_8!v+$bb|4=XgOZB~69*Fy NqW~ip6CbmXBmh2*T%rH~ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ``<meta charset=ENCODING>`` 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +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 <code>optgroup</code> + # 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +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"] + + +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 <application>/<type> + (?P<content_type>[-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) + 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>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + 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"] = "</%s>" % 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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +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/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +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('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + 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('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + 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 = dict([(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.normalizedTokens(): + 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 normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + 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('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + 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('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + 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 normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + 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 = dict((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] + try: + info = {"type": type_names[token['type']]} + except: + raise + 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 + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + 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): + return self.startTagHandler[token["name"]](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): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + 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): + # 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): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + 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"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # 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")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + 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")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + 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 + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + 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 <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + """Serializes the input token stream using the specified treewalker + + :arg input: the token stream to serialize + + :arg tree: the treewalker to use + + :arg encoding: the encoding to use + + :arg serializer_opts: any options to pass to the + :py:class:`html5lib.serializer.HTMLSerializer` that gets created + + :returns: the tree serialized as a string + + Example: + + >>> from html5lib.html5parser import parse + >>> from html5lib.serializer import serialize + >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') + >>> serialize(token_stream, omit_optional_tags=False) + '<html><head></head><body><p>Hi!</p></body></html>' + + """ + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer + + :arg inject_meta_charset: Whether or not to inject the meta charset. + + Defaults to ``True``. + + :arg quote_attr_values: Whether to quote attribute values that don't + require quoting per legacy browser behavior (``"legacy"``), when + required by the standard (``"spec"``), or always (``"always"``). + + Defaults to ``"legacy"``. + + :arg quote_char: Use given quote character for attribute quoting. + + Defaults to ``"`` which will use double quotes unless attribute + value contains a double quote, in which case single quotes are + used. + + :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute + values. + + Defaults to ``False``. + + :arg escape_rcdata: Whether to escape characters that need to be + escaped within normal elements within rcdata elements such as + style. + + Defaults to ``False``. + + :arg resolve_entities: Whether to resolve named character entities that + appear in the source tree. The XML predefined entities < > + & " ' are unaffected by this setting. + + Defaults to ``True``. + + :arg strip_whitespace: Whether to remove semantically meaningless + whitespace. (This compresses all whitespace to a single space + except within ``pre``.) + + Defaults to ``False``. + + :arg minimize_boolean_attributes: Shortens boolean attributes to give + just the attribute value, for example:: + + <input disabled="disabled"> + + becomes:: + + <input disabled> + + Defaults to ``True``. + + :arg use_trailing_solidus: Includes a close-tag slash at the end of the + start tag of void elements (empty elements whose end tag is + forbidden). E.g. ``<hr/>``. + + Defaults to ``False``. + + :arg space_before_trailing_solidus: Places a space immediately before + the closing slash in a tag using a trailing solidus. E.g. + ``<hr />``. Requires ``use_trailing_solidus=True``. + + Defaults to ``True``. + + :arg sanitize: Strip all unsafe or unknown constructs from output. + See :py:class:`html5lib.filters.sanitizer.Filter`. + + Defaults to ``False``. + + :arg omit_optional_tags: Omit start/end tags that are optional. + + Defaults to ``True``. + + :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. + + Defaults to ``False``. + + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + """Serializes the stream from the treewalker into a string + + :arg treewalker: the treewalker to serialize + + :arg encoding: the string encoding to use + + :returns: the serialized tree + + Example: + + >>> from html5lib import parse, getTreeWalker + >>> from html5lib.serializer import HTMLSerializer + >>> token_stream = parse('<html><body>Hi!</body></html>') + >>> walker = getTreeWalker('etree') + >>> serializer = HTMLSerializer(omit_optional_tags=False) + >>> serializer.render(walker(token_stream)) + '<html><head></head><body>Hi!</body></html>' + + """ + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""Tree adapters let you convert from one tree structure to another + +Example: + +.. code-block:: python + + from pip._vendor import html5lib + from pip._vendor.html5lib.treeadapters import genshi + + doc = '<html><body>Hi!</body></html>' + treebuilder = html5lib.getTreeBuilder('etree') + parser = html5lib.HTMLParser(tree=treebuilder) + tree = parser.parse(doc) + TreeWalker = html5lib.getTreeWalker('etree') + + genshi_tree = genshi.to_genshi(TreeWalker(tree)) + +""" +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26f0812ff504cfe43926381188d12802dc9c3dfb GIT binary patch literal 948 zcmZ?b<>g{vU|`Vf?~GZ_#K7<v#DQTB1_lNP1_p-WI0goW6ox2<6vh;$9L8LxD5hNI zDCS(2C>BPB6y_9`9M)X6C^klh6xMXcDE3N$6y_AR9M)WpC=N!3aE3e)7KT*LY_1|d zMg|a!WXR)*U`S<Oz?H(jkdcugg(H|jlQZ!GBLhQ7QEI9}VoG8`NorBCLQZOlLS=rb zLUMjyS!z*<LRwLNu0noZszM1!S#e2GX>v(vQK~{ozCvPNeo01Z5f_(hMPhD2PO23b zm!6(Na(+sxZc<Kua<-L~LP2FoMt&X_mx2Pspn}W-z4)@!yp;SRh0NT7{Gt+tjFQ|O z)11sCY-;pil6oN9;ckTLOi#@#&d3BCo|2!eV5^{R15$5ila!xQY3GrtXrm8i+316X z)j>9Z%t<QE%t=WtQm}>Ft(Tr!0tyBvh>V7MDoCBWCP+s?Vo@=wVvi7Cp8&9^21uDL zh=7_2)&b%x*eXCY>VYYZl>B6{9LSdN#GGtY6QR~aBoMZPtcQ3q9%?3pr&p364`FE_ z%mcecQ<ID9B`7IrGT-7)Oe)ULDJ@BjhlJNHj+D%@%;L=ayjudLd6}SiiqFX`Ni9mu zDSpWaN{@`Un2QrDir64*Hi#8P><kPHewy63*yH0<@{{A^Z*j%Pr<H;dL414>69WT7 z5i^KjVPIgm#Q@d}Qks~P6CV%OdyCr>9Mi5vMfpXy*b)m0Qu9()G8FNFbb*Lp_4)-x znPrJ3srqG!Mfz#^px7zaH!{{YHZwCTw<xhRFV2fku`tTDOtCaIF*YqXFfcGkFVGLs zFUTy=&CDw<NzBR7wJ^xd&d4^(0SSUJG@*fGAC$uML4gQMMEddZnR%Hd@$q^EmA5!- ja`RJ4b5iYuKsir<fq{XAQG|(yiH(VgQGk(;k&OuekQ^O) literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d9d127e0d1f06f3102651f9ce969eb3c0fad5a5 GIT binary patch literal 1545 zcmZ?b<>g{vU|`Vf?~K{Z#=!6x#DQTZ1_lNP1_p*=9|i`76owSW9EM!RD8^i-D5hNI zC}u{G7*h^QE^8EPE?X2En9rQUlFJ^&p34!%k;@synadT$mCGH)&B&0#lET`;5XF<i z7R;c@{t{$|Ci5-+#H8Z<oYIoi_{`jb{GyUu94VP)nZ=p;dA9^g^D>k3Q&Qt|GD}j6 z5_5_*nQpNL`X%P3-ePquDJd$}WWB{29O4)ha*Ns3&*c_Nh-*a1Ep}&rUtd?hkX!67 z{>~wh0j|l6AgdS{7}%gV8RVk~Mh1p-hFZo6j1?v|3@!{47-O|+nQE9)7$q5MnQNF+ zn6lZ5jA|GcFw`)mFiSElWMpK>ld54X@+o0VVOhXb!?=(!g*A;ijDZnsP7QMkTQ*zK zmKvrMc1eb!q7)7YtA;6sQ<5Q#NsOVEB@ZOVDalaFQo@|VmBQTuHG2WeLIxLxX2xd5 zTGkTQ61EzaX2u%UG$xq&HOwhI*-S-SQh32G<IQF&`T{Y%=oSHc*deCDOe*B5VNT)8 zW}3iQBv1l!4YMQziX4A7QxQ)IC&bk?Oeq4AAU6t1GNdu5Kz&=tQ^*s}P{TNZu_y#H zEK-Dm88n5fraI^6m8BMyC?qPB6s4vrl;kTUDx|086=!6E1-Q5r6ciM!5{uFm$`f<4 zQ;Vz=N-|QxQV>2!M`<xwBS-))3ldL;nw?n!HKr)Fq_iln*a~DrYEfcIevv|c8i)h3 zE-ybNwHTuC7E4KGL8>OxEiUJb#G=IHlGLK&Tl~QViOH!*0xT(sC5g8fG@1Qg{{R2~ ze~}<4dobPN2rfx1DhWwUzs2F2TToI7VsYjr=B5^d^jEP}s}|R)7T;n43Bl7GGXnzy zD+2>VFeuHLFo4or4MVI>3{x#*EmH|Y4Py#}Btr^gHfNDi3R4ZE7(*Ug4I?PMH8a*Q zr7=xpDr5;}&}1nBrC~pq9WOyVO~xXS!J5psnDh*8u_Tt16y0JiOUx-vUCB@+#lXPu zt5(0DD6=fFBvrpGu}D8HKPM%%s94{~Sl`&p%&gp^#L~PtFFwV>DAzK@($vJ*wA{eJ zz#zRqKSaMEvp_d9uec;JCr8)9AU8WB+b9Pl2*&Ycsd*{+Mfw>fxjCjenMwMf2u@5% zEC7Y3J|vFy3Mzkb+2mvvmn7%s7TC#xd=Dy2*chv1OY-BPifnT7lM{1_?eq{Ti-Z{% z7;dq-=B0pwm)$u(H#aq}<QBV2eljTPZgCWpCgo%%d#2ptD6T9nNzL_4@zdnG#g<r5 zkeZiL#0k>Pl9ivCR|LxKw^%bvQge%o*cliYz@b&d0b+p)ydrK;tg_u=1EsFiqFXE_ zsTC!+SWEJ=Q}c>=K&nJRX0d|8wHO?p5JDOx$_e)a$mC)hPyxfi!pO(S!N|cVz{tWV z#K^(~VvB)EAx05K4ulAk5EB=p5EBO@AEOX63lke-ktPEJgP$hvEw1?Zw9=B&qSW~K zB2aJ@fs#)V3j+f~6gM=?lJkpFAzlG_5aKhir$AmWg8K|?B*ev_v;bj&-Ogc?o1ape SlWGS_M8zOOM3@8^WtahunTFs1 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1925183ac9337e6eaa3df65d368a4e2eb89b8f5 GIT binary patch literal 1495 zcmZ?b<>g{vU|`Vf?~M7t#=!6x#DQTJ1_lNP1_p-W3<d^<6owSW9EM!RD8^i-D5hNI zC}u{G7*h^QE^8DkBSQ*v3QG=KE_)PvE=LpxBSR)b6laB6D*FPig$ynXu~IS2QQT2H zQM{?#DXiI?MRuvYshp|YHVlP!;S4EkDeNr_QG6+^!3>%lFG2QeGT-7)Oe)ULDJ@Bj z&&(~zFDkjkk&;=KS)7@lcT1o&FEcqmB{e=Lvm~`BF{fCQ@s@yNNl8&=QfWzQv0t!f zZb8mVCXmONZiy$RWR(_|xaAk6W~S#MRNay+&BGz(mkiPiatAvD0|Ofa1A{Xt95fgi z7-|?7Ff3$XWT;RmVO+oj_M1oyQ!P_1a}DDH<{G9N=7mg*4244B3>D{UKt4ZK%TmLV z!YIj5%UZ*l!j#Qa<WXo)Xi&qN!ko=kw5S9m%Oc58!rIJK%T~j<fUSllg;kQFh9!kf zk|B)=Lf5b@WM*WjVNGGrW-9tt!?=JQn<}u)Ad@+=nTk#jRK=OiR`j5TaREmSOA3o5 z!$L+z2C%!hvYCor6&j>)7aNptrtmZ~HZc|&gk$$HR}B+L-vq`&mT*wmaD&1og*TW% zldo#Eb7D@8La<|mZcb))szP#pUP)?Ri9$wVUP?}CkwQ{pacYV}ex5=}QEF;=Vor8y zkphI`;!;phP_RlYN{0$qDU@WSBC9LOS12t`RVc{^D}c*_1d{Xf%2JC;6f#SYjDgx| z1#%7C0T4qVs&28AR2HP(Vt2_;1~D|5ZgB*cBo>u~B&OfuaLp|!sRXfDQW8rNZ*k@& z=B5@GBqpccVgWIWco-NMZn3%MrGzA=Yck#9a?VIBN=z<EEh@gn9}H55B*5;RpPQSS zSK?MB6q=WvmtUTzP?DdWnx_D=)=!h?7H=`gUYGpjQjoG+d<8|RX_*!Axrqe@nR)5A zSTjpfbBk{YfmH>7<$NJhMXU@A3`HCuxA1{wU2{@FM)(Ea;z`X*LGZYe5$@x2EG|wh zD#^^xb1f>$FS;d=nwNrN>MicnycC#gG}&*lL89muJ2Xgdu|XVI#0RpN73`NHPB1&M zq@<{LB}0)i0|UdaD*b|@%(BFiRQ<BVBK@@doRrj}VtpfHePc5-vvP|POY`Eq_!JAH zT+0+oQxjv;asvYcgY*LZ5dDJ80^Q8K;*!Li99;{8-0X~Oqa2VR7{`~T=B4Bp>1UMW z=9uPWCh3C`Q({VD0VwqKixVsK3My~0mE^}4Csy!+@~{~wS95SM3NZ>WaWQf*axk)h zNj63yMm9z^Mvx2-oD^W>U}RzvU=m^!U@TGvl_&hSxZ>l}N=r(MQsd)`K*dB6Gbr3a zg=LgrMQ)BB$kK}3oTAjkl++?{q}<|6&IfrQucWvLRG@$(sYnzQNNi<^Ii;z^MG6cI z3{jjp`N@eneu=rM;LrqH2o60YLItFY!zMRBr8FnijuGS~P{@lg@h}N6u`r4-axn5R F0|2xMspbFx literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + """Convert a tree to a genshi tree + + :arg walker: the treewalker to use to walk the tree to convert it + + :returns: generator of genshi nodes + + """ + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker + + :arg walker: the treewalker to use to walk the tree to convert it + + :arg handler: SAX handler to use + + """ + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""A collection of modules for building different kinds of trees from HTML +documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1. A set of classes for various types of elements: Document, Doctype, Comment, + Element. These must implement the interface of ``base.treebuilders.Node`` + (although comment nodes have a different signature for their constructor, + see ``treebuilders.etree.Comment``) Textual content may also be implemented + as another node type, or not, as your tree implementation requires. + +2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits + from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: + + * ``documentClass`` - the class to use for the bottommost node of a document + * ``elementClass`` - the class to use for HTML Elements + * ``commentClass`` - the class to use for comments + * ``doctypeClass`` - the class to use for doctypes + + It also has one required method: + + * ``getDocument`` - Returns the root node of the complete document tree + +3. If you wish to run the unit tests, you must also create a ``testSerializer`` + method on your treebuilder which accepts a node and returns a string + containing Node and its children serialized according to the format used in + the unittests + +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of trees with built-in support + + :arg treeType: the name of the tree type required (case-insensitive). Supported + values are: + + * "dom" - A generic builder for DOM implementations, defaulting to a + xml.dom.minidom based implementation. + * "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to xml.etree.cElementTree if + available and xml.etree.ElementTree if not. + * "lxml" - A etree-based builder for lxml.etree, handling limitations + of lxml's implementation. + + :arg implementation: (Currently applies to the "etree" and "dom" tree + types). A module implementing the tree type e.g. xml.etree.ElementTree + or xml.etree.cElementTree. + + :arg kwargs: Any additional options to pass to the TreeBuilder when + creating it. + + Example: + + >>> from html5lib.treebuilders import getTreeBuilder + >>> builder = getTreeBuilder('etree') + + """ + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d29bfee488a6e285b8b716d85cf555145242edbd GIT binary patch literal 3329 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 NfrUwgiHC`W82~fT9n=5- literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..262c4be89e4c576d04cf424c0a472b9ecf41f7a3 GIT binary patch literal 11252 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 J7J*~|2>=zSzMcR8 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed73c67bfba65b72d8a221c8b44840b75b3e93df GIT binary patch literal 9282 zcmZ?b<>g{vU|`Vf?~G|yVqka-;=nKy0|SEt0|P^G4Fdy13PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDmo<tN%x2DE%Vm#Z&*g~X0P|ULIHNdISX0<?xN^CpxEUEz*i$%ixN>=- zc))DV9G+a>C|)p|D~B(aKZ>7`A%#1Ir-dO(AeBE=pqVjBFoh+UL6i3-$W5BexA+s2 zit}?yOH$)Aa|`l|N^WtaWR_(XXXfYK5-82fOwLb9jnBy}Ni9muDb{4X#phdEl9-f} z>YG?lkeQdR$#jc7H#09YB|rBTi(h_9s^3dSkmnh1u_PrHr@jPvSd;M<XL5dCaY<rc z3CIYpyu{qp;)2BFR1i-jH$SB`C)F)6xg@`+5=te53;{V1q@R_6fq@wmXkiQt3>{3J zjP496j44bl3@J<{49(1)4DJl=4DHNmOexGMEG--<EG3LtOwG)l%<c^BjO|SA%<U{` zETBMZ;YeXCVa#G~X0Bxf1zZb5Crb%SGea<gCZ}IA$T}DXSqqLQ9|i`7RE8+V6ox1! zh^0}?U~3qnAVxAou|kZBVoTvn;c8)sVuyw|M+$EWUkgJNX9|CcKnp_@SBhXTgQifG ze0pk$OMb3XX=YAJYLT8zPJVJ?PO+VyV@XMoPiApRGRSg}LqIeL2ZQ_$N>eqAH4O0# zDIoVU`e`!WVo%LU%}vcK(PX;CQk<HTR>a4^z_5~`NPvNX;a8P@K~ZK|Vo9ogSz?iX zT0Y3KVtpfHePc5-vvP|POY`Eq_!JAHT+0+oQxjv;asvYcgY*LZ5dDJ80^Lkdbmipe zS{USJXJi}YfCRxfzAQB_CBH~Nqa-)SG$%7jzoaNNH3{OEV*Ql-T)l$ITO9H6nR%Hd z@$o_+r-S^!z*wb0z~6c>P4LJEB?3^yg98BMsS<`7hAhS`rUlFk8JZb`88jLFG+A!3 zfKn&e@3*)TOG=6|lS)fci*K=Hr&bngG8XYOFhGI?94<wI3=9ll2bQE3#m9@1=s>Wh zWRRmkF~kB*nP3N+FfcHbFw`)XFg7z436wB3G3F`MFk~@ju`FP%VO+>q%Ur`$!yM06 z!weQ>uVJ)-$0f%tuFPU^nCB&@-eN5&Eyzi|CG3}9;+b0jiR081*P^2QB8WG6^UL#6 zi(K-POF_{e#h+Z1nplzwN<d)0-(oFG%qdMR5&`8z7H|OEVgY5kB59E4SwMjV2@Fu6 zLPCT)KE61$B(o$nH$Gkh6eyqs$H2(N$i~FS$i`TuO*r=8`cWbf6#L-t;emt?I09jj z$9#)9Cp8c3DTr&aM;Cj1d`@a!e7pk4VITt;7^~C?I|!@?#WA3W13L!faU7{BC$qQ& z;i6ltpfJIaj*65R7#Nh19HmOgQDDPJbW)KbC<TM^HaLuKv4LY3my<xwQA2W)8X+e^ zOhYMk;K2m)A6lB`1E*e=8b(QmEY@In3T7)32e}fIbc!TFEVz5YiB6LVoD7R(KvJN< zhonDnX5@~KPlqKvO_0mkKzR$C^oU7zaJ|^QAO}fy$k~z$<^@~0^I35^pMc9#QbCnt zZhX8x=`M%s_0!}A6-l5h8Xtd)D?T1lC&tI$;)#zhEKSUT$P|H!(;_iY5Q2PF1j-KJ zBv=HB^dc3Iger(Y1TdHd4rLBd@c^n{K)hm*I0qvKGY2yV2bg5$U@HOzK1wwRN(Z30 zDDJ^h4W_a{D#B*QC{}Ro$`HktB9+3C!r8(Y#h${I!rj6U#gW33!V9hh`BL~nm0&wV z8e@t;ieL*z6nBbHif{`<6i+HkDt9VRGgB0AJ7XGSib#rR3r7@Ridc$x3qurtibRSe zxcR~YZN9JvGiXXzDd9-hphgI^ZbeBDpt2gA^`*cGB8zbWQw>86V;1v5CPoHu&B_9+ zSy_uXL7~VFB0xcYiz5%zvPsNM1(yr36ah}*pnycAWpE6cfl>m<ItE4o+yy6+I|<Z$ zpgaXBt5QH!iwL9+ED!@bm&xxI4=8nj+f$)Io|??J*fSD~!9_gSf!d%-0DG~@VUv@X zo0O7hX9aRGs9fbC&b=^wC;<#gEZ_hJxfc|)@!;Be0aFcQ7UM!jQ2P~9V>91kD@ZI# z&4ZM(x407v3R3e@oHH_WQlLS5iv<+mkYEJ|FeuFyfpVBF$fc05Wn-+;Bb)~GkWBYO zsklL=fZYqKxN8`)7{EyaT2U9NfJ7EB*D%*GWifz~NFEPZgr$ZV*)Oc%6j209Q@8ja z)o@5^MF}W!Z}DX26{i-JIHjiL7o~z-uL-M+QxZ!Oi;TdPaY<@L37SuDaY1x~OmYNy zm;;mv8TlAl7=@UsbcygZLO<Ngpy+{n8B`2|y~9|;n8g6|A~@2Rz{!fyPm>wqHIOTd z^gxM-8B&BBfSk=<l$r+eB$~^?e)0f08Dtd$qYz`2KGDvF1Qhl(1**|NPR(KjIXj!F zNCrfM(-s3HK57`_nPE<60Xsd43zE!0?!3ial$x7gmI_W~5br>1B#?K|ePPbPzyNCb z7ei_yK1M#`(i)N-aBqOZ9fZM24V2L;^uSJMT*y!aW@RzeGJ!>yYnVV@0eN!)3xr+B z6wZ*&P{R<<3iBEp*lV|VGZKrzegS!|IEpJRv#7WPEKme;JUF%8;z|bPDX<DnNaWq( z%u6i~0B62itYBF*uip|VN`-_P#IV%7Ku~N#8iPEH9E?1mGR>HXI7K%HrO^W_YlLA2 zcYw+Xczd1^>_KR|U6T=9DM1_wDg<uvrl*#GYBF#`w>Sc12FNf5#wr6M9EGA89z~!I zCMc%CQB=jiz)-_jR8~;{YWOT*1obpr7-AD*m};47nM;^zm`a$NnTk?sm{J%e8B!Rs zIg8w&Y$kDr8m1IxNd|F-T9!Nx2)mZ0h5_6KU`k<;WT*j^AIyvlg+gFaHc*!URJs%j zg+tmRtbRqHZqF}9t0GXYF9L<UCOf1F2x^TXwNpUFdlX+WQh4|UNAV!@HCZ897Ss`d zG`&C_fGA#2lOi)MGd0BzRHuPUSTF$zVPq4Eqd_4I($B!i!YIbb#mK`b#>BzM$H>9N zMqHSq7>AMyKxG6t6@V;<q=E&EDU1sl!QBHUKQ~P#aALT{nVgfKmkLVA@N{vD8^ncH z^oaCP1nRYCf!qvD6*@$u3b^Sgt^*kWP7$Ce0B2Cfh0v}y#92iapi&Wg)yf6RpZR$u zsd**2NUkBK>_+Is?i>wJ0%gboB|VNJi4sOoGOS_9VoGBQ24^G~8(d;A`Q2gxb=5VQ zZ*jt#2}Pi;7&tvZgA)>dpjd!(26@s`OF&5@1k?{L0J$HOJwUxdJ|?0HbY%UYPP$ML zr~ofg2eqg`?gzJ%ZgCV8<rkzDl~fkFfFwZmdyy%K1+H_z<(LhK3##;s>_IG0LIg)~ zkrRmP3aX00{sOxc><vvONRa`mIKcv7FBO5fAhU}>RUZc<2MZ4~2MZTF2MY%)2Rjcl z2QL>B52!WF23CpE3I-)pPz7AvgwzTKw_`!0P#jUr?F{Wqu+gU|mK3perZmPBwiNaj z&L~ze8`LJ|h++e?LG5CWD0XPOn4_IJjWGq(Hs*-p1h<Pp14WQ_F?WhMxGl^W#WRI5 ziZ_KdiZ6vVm_btlXWKWVC^Z$DB~a21sDJ}!G*GvpgJA)~LWTv5DGVUEkhz8-o~eX+ z0ZR?TLg<hR>n#ybuJQMUk3J-pWaj5ZK^r)*afe&Xpiw{e^3=raqSUlotOZ5+6_wBw zrO9}U*(E<05dpV&Q=r2Y&N+$2#g(8$1rAt75!}THl7IA2w8M*TP#YcYyC6``0OyBV zrW(c+CP{``<{Cy&fn3W1@pUb04eJ6%P@!AHvXHr!4U|_FFn2K4ur-65s2vO?EZIy& zel-kPtTk-$Y~Vb^;s?$vw>Sz)lX5bXJyULR6jv6Pq~?02XtEc9T02ofkft9jWI`$n zQg3m<Tnw&^i$FQ3$P<)mL5)RCc5umji?t*_J2ek%evuzY(w~6=G=!L+o0(gXbBjGC zKe?o`AXSs82-F?{r%mKAg|zcrAc|^1VG7E`42&Eg2ri}t7&(XwUlgM-Tgu?%1M1n- zFr_eLa}<Gwwjf0ihz06Qfm_abpy2_=1)!lW#)V9^%pD9h%;3@-JW?l+lA4xSngcFd zz#SHFfZXDRgq|y8qzg8j1?Bn$LtD*|KmwN(pf;N(BYJ4?K!-!Y39JJY7@!&y)ClEc z!c%S`Co*Ic;Asq05rC2^I0!)D3#+O?qk1sUF@e1j1@($^elBQa4%(e5GKN$XpfU(4 z_IQ#Zs=)4@0CF$LCI;M1W@MKl>qW`yptdI1rJ&|P2e?LnG-4o~FQ_}kAVCgGux>?( z>0k##YBS8R<xPXC06TUvl4Ef-yO14=q8TMzL9PW?vY>u8q>`;+%mTNA!Fdnd4*};I zaP0u{6D&|ci2xFspg4h)@*qXikQ|4rgNW=nqz)pA(?F2{4oFZc>R_mWv`QHLz;?nM z0d^4MExwY};*#LhqRhmc%&OEPuo8%iA{iJMW+J)BFdh5oKeCHZ4MT}tP}>k3UZCOx z6kd>6Wdx@_XxR&~9UdsRxWQIJ#){`4Ifa<OLDGui4tTtQ0-yxab!J$|n8gfn4-0q% z<rX)RufWcLr897|4!d)UVi*`0=9BJBn9(R5UQpEl4lYn5riQT=RP-}sGZ)FhoLs|L z!?ci@ks;5o1T-wq0v=(BC}GV4RShgz?Ah!^5hWa;wt5zOGb4zOX9tm4><c(Ss=ysK zQ2QP<rpU5@8&o8K#K4J{$?uk6Jh+z?4;s&i2bJW-nmpjJDT)S__MjF?kq(FjPUE23 z>=tK;YeY!ApTCQ1Q7lLXH2Qms4U$SBRf!>}IDvHNz(otVKZ_RY;D*#9P%wfL0;uuM z!6?Mc!^FoZ0P4ZvYKS65m>#4?01ZNbnsAJMn*8XkIA4(aK;c^inwl#L2XR4NGKe!l zNxvuxBnFC7u!C;#fvPp|q!qYH0V&f#F4SZJ*KoH4UGj5Ln;np19&8v$AtYOYLazek zJJ4Vg2O|#)A2%Nd4>PC<2f`f8T)Zrd;4nr>w(w#cRCv^Y8$yf>=?t9=DXi@b?Tl$m zDNHHMEu5W<9gH;$ptQiqkixQnu>;aHVuSR};H3mN0|Nsn%D|<B3KIjkumw#%W-}Ev zfyS7NvOsC2SPs;jC<*|v3)E5=!QFk<0)rGrQ2n@o4P<8xqX<YhsNQ5wV-W+7X%yCV zFf3q8VM$?z$)+(uWb#D7GOQ4pG)9Q%1jf87P?1o=n8lvWR5S;yh7FV&CotwEKxH_x znToc7W!RxIZcrJ{Y^I`nU>OdGxit(~Tre9aFy?`L!BE1O#huMGfw71UtdbK`W!|?E zo*IS}u4a%bvl@mhUQi!-0%MU`3U>)#7C%Tt6699_klD2?d7zvo0B)eMrSL$_V*$y5 z+*iY}KyV?$1jeF2=?t~36=@|xCBiifSt8Ah&5SM#u_53loX7&v8n%Uuwd^(QSpu~z zHSAepwH!6<S-iEJHJlR|i`GGH=9FZpVb2l=nGLoVqMCI9TMbJMM;f@&nZQ_B5YA9x zR3cHs3bsKlhN+gNmILftUXbfj_{14RK>c`*G-g=17hVcys9{XuGiRt}tdOc<$dYtn zh!v>i>R_zls$pzqVq}=WRLBGE;q&|5VyKd;Q7yJnbn$l%i41U6P%TzaQY}^j6L!BC z6{-Z#r0uHsP(<viIF(_|%PJu_Qx{gzLY3?4f{fPHwX0&UQ7r~pQ3M(eu3}X!R!}Vl z3)-j_+f{MZs1~ah+kzE<db^rZQQ#qOP&>8=l)|HgT>PCweO>)R;z16Eluk0BtPO9p z7R7^FuDoz{paLvP49;~6a&!ml2aEGK`}-nzoS@P%3_N8S2Qm{}Ac7oP1j=EcZenU$ zW<_dokrvpBjKpHZ2+%FoqQt!P)FOG1Mo{+<JRO`1o^*=h1kbI5da}3Jit~#~Qd5d7 zL1ia5xc<4tmYJ6V8iq#r0qiBPDU6v#vLGWt117ha@`{VBK^mEEF%^~F5-5h%^w2gc zr0fNao)qOUFfeQb6-*#Q85nsO*%)~kxj>Uyj1o*zOcIPdjC@cm!^p=d#l*u1hD>bW z(G?a(5wIRMMi3NZVq+9x5@J*W54=^`gKJ~Vl>?~l1;mO1bZ6dT<kDmW4=-sl-Qvv4 zFUkcsS8lOn<!9z;LI&QzUeRPK$_9BJ<QYhL3o3p$fxHDu9-#gO3zL8z7gH6k2~Sif zX|fi9YGO#m2TD)ilKB=JIC_dTnTirYwt>oYi1n<HE<Cu)1C|1}oI!2?y9PW6h*&}a zYJwDlhBO!$S(pS=B%EceILwL)LGdL7noLV8Eh#NZjgKz^wdjgKEteutJ#dRVIX@>S zH5t^kEe5;q7JEf*j$TTBZV{+;1y1-yULcnxfe7%N5GX-{hfi*?#g~?3<`ft4g5*G! x-2#o8xa8;hg4eTvJ%U7l62~nL8_2|-9jF;s3`%Dr%%A~P4p=H+=BQ_g2LMR^PznG5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac9c9f6f3bac7544d6e17fab4bc5c0782831377e GIT binary patch literal 11861 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd42dc504d862375d3d3b5e20933a28435f200f3 GIT binary patch literal 11801 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 Pn0S~4*ai4F{5doMV%p&a literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + """Represents an item in the tree""" + def __init__(self, name): + """Creates a Node + + :arg name: The tag name associated with the node + + """ + # The tag name assocaited with the node + self.name = name + # The parent of the current node (or None for the document node) + self.parent = None + # The value of the current node (applies to text nodes and comments) + self.value = None + # A dict holding name -> value pairs for attributes of the node + self.attributes = {} + # A list of child nodes of the current node. This must include all + # elements but not necessarily other node types. + self.childNodes = [] + # A list of miscellaneous flags that can be set on the node. + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + + :arg node: the node to insert + + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + + :arg data: the data to insert + + :arg insertBefore: True if you want to insert the text before the node + and False if you want to insert it after the node + + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node + + :arg node: the node to insert + + :arg refNode: the child node to insert the node before + + """ + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + + :arg node: the child node to remove + + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + + :arg newParent: the node to move all this node's children to + + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + + * documentClass - the class to use for the bottommost node of a document + * elementClass - the class to use for HTML Elements + * commentClass - the class to use for comments + * doctypeClass - the class to use for doctypes + + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + """Create a TreeBuilder + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + """ + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + """Return the final tree""" + return self.document + + def getFragment(self): + """Return the final fragment""" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + + :arg node: the node from which to start serializing + + """ + raise NotImplementedError diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + :arg str treeType: the name of the tree type required (case-insensitive). + Supported values are: + + * "dom": The xml.dom.minidom DOM implementation + * "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with ElementTree, + cElementTree and lxml.etree). + * "lxml": Optimized walker for lxml.etree + * "genshi": a Genshi stream + + :arg implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the "etree" + tree type only). + + :arg kwargs: keyword arguments passed to the etree walker--for other + walkers, this has no effect + + :returns: a TreeWalker class + + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers + + Takes a TreeWalker instance and pretty prints the output of walking the tree. + + :arg walker: a TreeWalker instance + + """ + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe07bb4a196518d5cc609930281995695c59e818 GIT binary patch literal 4006 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bb4be295a944fd9bf2fafa7bd7046306ee04325 GIT binary patch literal 7002 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff3bd941802cdb83c53424de5233a383fc90878a GIT binary patch literal 1731 zcmZ?b<>g{vU|`Vf?~G|>Wng#=;=nKq0|SEt0|P^`69WT73PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDmo<u&ks*aSg(ZhAmpzJ|k-?oIg*An(g&~D4l|752nK_Cxg*})-lj9}G zWKHH<{E11$`8lN}sqvY)1^GoKw>VNV%QA~I^Yd;Al;&k7=clB`=VX?o7A58sYck$q z@ykz1eaQ%NCgUxZq{QOXWRO8H%mj0$4g&*2Dnk@w3PTiA3S$aW3quq$$XP86Q7jM# zMX{!^r*O0|M6soC1~X`K-Qo%<N=*$<%*jqIN(Pw&G85!&HU<U;XOP#wFfcIGFlI57 zFlI4jGZiV6FlVvUFlMpVFlMpUFlMo*u>`~9IZ7C_IMbN2*^2B+n6tQQ7_+$3nBcNJ z*-S;7G8t-_D!fW~YZ$Zm7Vs}*Xl8U_h_$F?u3=mtP{X{Cv6i`pIZLppt%f;EsD=r| zu3^p+PGhoRD2#)Mr7+YmXR$&=!Wl}KvqWkbvjl4xvqWo{Y8V%YEo4Yzh1)5f%~W)% zggHwB%`K88j9F4(mp&<B&XP`J3<jAb1M(-x#VHKI44RC7nzB(GdHE@+A(aKGMXU@A z3{gTZ{?4Jku6`l$A&~*D@qYd;u0`x133eBMXOPe>mb}E=)LR?{rAaxN$(|{<IEpKa zOHy+^Q=&LSTq8ojTB3xUT^vIk<AYtDLp=TcAYv>a=_pQ+ePM|?rKwRou0F0{t3bBg zV#&!YF1f{(SW;4ynN(VmT6~KoJGHVnN+3P8#1SS4N+wY}AQu!DBqpbZ26^6MEdv|I znUkNKnB$k2n;OLqHTM?SZ(t$bjKpH+jLe)AkO9R}JkI{U2%FiVyeM9{=Rq!t5`%Ny zf*jr9>Z3Sd;<wmC{k;AB!~HZ_Zm|@n=A_+X0r~D0E65YYw^%^bN`@kF1_p*-mHGum znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI($6T#%`wf%OwunYN=+>Xr}kp~ zl>A)1g34Qb>8T|kf4iiXBxdFmbAl4R3Md;e@-T`p2{H08@i4M5iZF69vN4J<i7@hj zMR=Hm7&(}$BoWz157iuaZUW^hP}T+KCQ!Blr7}qRVvOQS%PcA`0f)UNQ;{$O14EGr zhyVo&IAn?>7#J9C@usJixWQF|TvrS-mVvQK0@VQsMa0?9otIis5}cWolbM%}&jH{- zLMT-S1rpQ+=s|!`MVu433KEM_^T1Jn&jp|$2!N~9LUI6F5Fix!X|mtqh>r*5hxqtg zT=DU_`6;D2sqyi*c;e#=OA~V-GDVW05SIcG(jY<xL?9vn%mT$i5eEYU0|*y`2o6RL zX%1!%X0WKACKt&3w9=B&qSW~KB2ds2F@wwjm8G}XD{^!6Qu1@bg~%-iNRc7tm!B7u rnp|2`oLQENh()k@kf;aS3?@L<-{P==xZe(xnu<XwNrZ`qiH8{gpRls7 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e0d118db8db9cd96ab3dda30a9cf34a36e6302c GIT binary patch literal 3538 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd997aa97df50108d1697878e5eaca35397744cf GIT binary patch literal 6647 zcmZ?b<>g{vU|`Vf?~GY0!NBks#DQTJ1_lNP1_p-Wbqov)DGVu$ISjdsQH;4vQB1ka zQOt}WF{T`rT-GR7Fq=7tEtfrtosl7hC51JIBbPIZlaV2XErmUYE0;Tp8!XO|!<EYu z#ly&u!kNO=!Vtyl&XB^L!qdW#!jsC^%pAq<&XB^J!q>u(!UyIHxHF{irwFt#qzI() zH#0{Gx-+B*rU<n#qzHlKh1?lZgi}OX7*a%1xwC|unWIEfM1vVL#a@DZp~-xUKQXB| zKc}=LH9j-9Ait>O7Dq~ES!Qu&e%>vC(!9*%{FK!AoXnEcqQsnHO~zZCC8-r9@g<c7 zshW(pSW`=iQd3_tfdYu}7FS7PdVEo8dTK?%OGbzgOHyJnNFir@W=3L3YDI2NGDrqw zHHZcUpfe}{wHO!}Y8X-&vN?))QW%06N*HPwN*J4&ilk~7f*EQU7BHnSrZ6pJ3T6Pw zYBKxXVofYg&dj{UR$Nk)nOvgDe2XiyI5V%fBrz{JwTP90f#DWgN-D_lnvAy?i&ruf z2{JG+{A$oID9S8LEJ@WbODxh)%g;$kEh^SGGS)XXGczl<D6upz&Wlg6Fv_(|u{1R? zHZ3<WFfd3j&=1is$SlwWo1c@TYhjR^osn&n0}=$|__EZzl>8$7jFQ|O)11sCeNeEJ zC+1{>Ob3Tid`?Afj$T3KEw0qO;?knj_~Mcx9+1z$sf&?=k%f_qk%g&9n1O*I85BG) z3<_It8q;B5U`S<%VoYI(0tZG5Llkoga|%lfLljF2YYJNnLlkQYdkRMjLlj#IXE1{% z*DaQy{QQz+kO?5um>C!tI2afhzyW>^6yS_C4Dk%<3^fe#jFnb3j9E-s%tbCW3|Wi| zSV~xH7)sc{V(iU~P!<QA#o5f*%(9S?ks+KRPlSb`ge#k?D2kB*1S1*pm?9V|d1@FJ za4%%2WeR7=lYpvd0Le2l)G*dEK~z;p)G#gJSqO@F&Z1cmb}dt3OE^P?LJd<2LpEp8 z9*BEtm_WAGFfHH(nOQh5oFN6|Zay%{4^9+}ewqSN+^IRKxv6<2pa{6dk(`m4lTwtL z7sZ~EpPZSOmLJ8PnOBlpl$V&}65?`;EwP{=H815ByGwpDC`E%qKZ>&`KffeCFEKau z7H2_eQch-ad}c}%S8-)=NosC<X;IECKF5-hqRgbyl2q5CqWq#;?CGf`AWc!+>8T|J zMX6<(`K85R(Y(}(l3OgGEOU#cBr!8bllc})acWN5EvD3xTP%6`DXHLe2_b|)sg@%? zJ~J<~BtBjYlsZ89f`O5Zk&TIok%N&73`H3Ez<eG?K1MDkK1Lo!E=C?k9ws)%Dqc{8 z>%mNb$2=$nfG{}bK?$ygA&a4gQIa8;L6gx>ld(t?lv|mK<UkH!&Q7g_xCfMDiolNI zj*m}IEy)D=Ki&}JE|6&qj8y_q`{0r&xf_(j!B&E@IW&sECTlW+tpc+l1jv>mX$A%c z6C~4lz^13CmViPLkI9U|44O=SMVt%_kX(-4_*?Ap@j0n^@$u#uRzM~EG}&))#Dil# zKK>S0e0*+xN@-4NeEcn*`1r!o#2iqXh>tH)1X-jEB0w%KQUS5RVTB;T{t;ndU;u?| zF(}t@Fmgz9Fmo^$fkd(Aa2dQgJeWa~tw<bHJb+3!P=*H4pojp6u?9Rt*D!%HbPaP2 zLp)OrOASLjGdPp5fJs(pJZQ4rf~NEQl+;@+AfFXUfTEuhn$9y*ia_ouk_9CVR!Dq- z>?qO%c^9O#2$VP>(FgW8*w3J_u>l1zsBi<PTyW}TW2_Q@W->(b1f>s<KR`6xA0U08 z<e9~o0!g6InAKz|0$UFXQ0x&5PCu?7yFrFAFjn!yY=kBuKTXymRgmk|K!iGo067<| z56K@0&wxVP8e||S0dp{Na6-Z#<YpKKSp_bhL4k$4cm_q@EgrX`#B@;M1WMN^nG;kr zgK#k@EwwYGF@kEl7LFQ57lvlW4u*J!6b2TC4u*ITn+Y6)%zp3;0dfK;DS)buVo<38 zD$!&4Y8guyIv8pgo0%pu6|w}wvc@fbm@C4IK*e8?Cetk@J%d}U;Ia}WWI+-7i_0b_ zv$!NVKexcn8x#~E+t?VYG-0NI`~r_sJ)4~T<iwm}J3WLhO=fWMf|Qyd1r0<L6xc9J zLH2<&mlwz)P?$3?iZE7*VzmnHeNgHFVQ?-0X#$52qaQd%VMc?j0Skc3GjNRifh+;} zhJmq41jPz+lZ!S31A`~XRFEq;7&%yqKqA=ldI;XUj$WImaJ4W*u|wK{Q5=x=Ulb># z-513LY41gGrw9i#Xo?hp8Vbpv)C5YSAR2_hp#!qC23+Yw%7_vsQ01BeYG-MbFoW1x zEX^Q!mOM6aX~6<j!PLxD<ONm13Rb}iRRJkanEjBVmkpdzZ!za5W!+-WNGwh)DJcTi ztVn8@!39bbZyGd5#Dl8OA_GvCM2jj=4h;qcssPA4pu&Wahf#ou4NO)^z#<NsnBgfA zBYS}Z093e?Fn~M?$`_E@j|p5+gB=O7UlW=-!NnY^TW&$BL6Fk;_;`?;pvgxX(-rBd zB@lJ+bP9?E5C%KM3{+Y(WHDqh)-u*GE?}x*Sjbq*RKrxlT*KJRn8GN*kj+q}SHoDt zl)@;^0IH}#sTzb~HJv64IGDk?=oV{cUP@}kE#{omJWXiOaujDK<z(ii7vEyeOsRmR zeXw`HxeQcsC4qbZY7H=en-&6$JWN&M=stnw1(e_f`5NpCkY-R>jog$#4nrj@@d>Io zvp_b3OkrTG!X9>zrUpFhK=~V_9&Rfn5}QFaKck-}(=C>y{QMkn`oW&#LG?OFNql@R zlHFKR4@41)#URVU7K5@iI12C<F1I*AjljgB)Vz`cB)cTBglqv=6^dneeaT#0QiRWw z?D3#(MSOfQlD!x)3ROe2twmO#SOiBa)@B<hSHSv-@nuLhV~JU~I^u0N#cw;f^;L;v zD;EEPTYY|-JXkA#W03iv>`(+snMD>Lt|f>7Rs2PurVQ8$qzr_}MWB*42xK=XPjN7E z@Nh75aDW<l5DY1aLB$pfgJKulS^zb3akmz575~8unmo6-LW)vT!@+$^lw1i)o#12& zsy#~>Y8b)&XSot4P>BL+1(vXYShb9K0wqk%pw1I>2`faTge{AG0Y?o(4dX&4Murm3 z1zZb3^4!qGuE|rx2WlF!fLa2#n2S?OZVA8&Zf9r@3tZKK+qOlZQsI`EUw&RtYI12& zab{U6!o}d~y@(rR8n0(wT7GeAiCbn)Novt8wlpveEq-sYfI4tUfes2`u;w~Yc!Qk7 zzy$6NF>x?*F!C{02_r1QtOP(^19n)~cM2l|XnX+@K2|l1F-*1KvNwe>o2^)_geiro zhDnT}nX!qnggJ|)gca2Jtzl|rYGzDh0*_2EmasQ775S7fXK|!4LPa>6nToPXn6tQQ z7_+!*7_)e47_)fOSfH|e%}hmoCHysvDa_4G#eEQSYZ$WxAZFGuW(k%EWeI096|E{^ z&JqE|OO_~#oLDwf(YX@lEOD3|Xb7p5Ns<BVCW!@-U~$1_#)XWv%r(pt7>YjCFfWi= z$PmL+%Tmjl$CtuT3+mJ}W(hVk*0N?Y)Us71l}OhxX2~p&UC7YP=)w>i5W`f<UdvI! zTEpJVSj%3*TEo%ISj$l&u|Tqh9cnIPQCJN}4O<QK0=X2Hg^XaDZ6RYClMO>24@f43 zp@tpAo4{Bo63$S<oFxzHgJdZzP^@8H$XLTxq6A8FDeT!S6BrA6Y8bOb(^#RSIvjqQ zOo%o@m1;<8MTr8ak6f&fSd^*&>P0K$7b$@H(K-rg`K5U&3aZ7om`f7V!F|7%|NsC0 zUj&NgB2ba7sSHWAtR<xdIjOh!9E*!ni%K%{^T2&}a4L;r32}`GfwWDGKzSb2H;dwM z@plgOb@dAYxAvphUHqLxA_H8}J3gSyUj*t5gG=NhP{*T)4V19io%3@+t^8Z;&i=k& zb3lEATWqd*C7C6aQEaY$A)X<TMW9aME!Nz`lH`nAZ0SY$r3J-Bb|C$1poT+c(k)g{ zC0Klm6)YFU?&{+THVl-<Z*iv;<>yA^=J+M%rWS#UNKH;~i>gQg<PC7W>jN^26V$OQ zE=WvH1v~H-E6D6(uvc!emL=wtVvIlVrKgto<)@^&q=Le^xD%A!Ks5jZBNrnFqX?r2 z6Bi=~6BnZhlL(^#6R0W1!zjTbz{tkP#{?e3Vw7M6Wl1hZHbyBXAw~hlDoLcQiE27Z z0S0dzIWZt*P@xj06h=s91SOnejT*)*mSPQ1HU)`-ctvKQj0MUFHH;}Nu*Q-mt6!Bg zQWDBYEK60$%U1yRbBa>)szgBERLDpyMizynKXCeC1*e}PcTk9WfCx}HgXN)x6eO_0 z)d83Ql~K2N(?LaAQE>^lWZVP_K2U+kz$nBd#>mFV!Bi!I8XRt!FvalD0EGkygQB_^ z)J%gH=RWv~s~V;h=4_@S7f2(r$PPI)@;GW37qBb@4W=??u@*(uFs86VLJT6R$wp4* z1BV7Uw?W1U*sul}xON4PBS6}wkZ=PhQgFC|32@+n6JKgYNid}Cx*HUFAPHFF<6!1s z<X~cB;$Xr^R0v(zgAt`xG$A4wooX0^8S?l*{iQ7CY_=jNP;CecL`@d5gG&=5U4dEz zMW8kZwC#>Nd_ajS0NiK<rQOq@;DL0DAbFF6k&Ov7ij1Db5L)~+Ik2{ZLP6;}3`B&3 zhzJk?jur#~iiaXw1_p*&khP#R&B4gQ&7sM`$sqt1_tO*w4VtBumVm~$<BLFzogz>& zE&?@8Zt)jn7U)3-%JqsfD<FgPETD05aJd;J1gi3rN;AP@@_OJ=b4Ve{04}V-tp;#e zeTywWDJwO(1k&694bnhbAK((%5#)4`Gm#n(U{8SDe~ZHgGNxw-%HiO_5)nooCeY|9 S4-*eF2d99V0G|M-fHnYV=4*fe literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61a7ae72edc055b39274831245ea2011dc5c5f6b GIT binary patch literal 1905 zcmZ?b<>g{vU|`Vf?~GyPWMFs<;=nKq0|SEt0|P^G9|HqJ3PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDmo<tN%x2DE$z_XT%Vm#Z&*g~X$mNXU%;k#W0?V=Fu;g+_ap&?x@#OMG z@#gYH@#XSI@#hLe2{1CGu%@u(2<8e!2{AIHu%~e32<M7KiR6k#i83;{Go)~)aJ4X` zaHR@mi8V7viKTD{GidU>1i4a^`4)d-QgMDxX-R5)W^O@#QOPZil+3cs;>`TKTLPtd znaTMnsqs0PC8<S;ImMccw^#%H5_3~ES#Plhhd2g>++ue1bGgME;p-Fc=jiJi9N_5e zdW+q~-#H{Q!1WeOh-*ZMCfh9zu-bUP;9G32el8%I8zSQD;uzw1ixVUWVKN1H-ePz5 z_w{x43wg;13RuQlEJ=yQsV|v89Hv`5W%-#Yt~sf>sd**Ex47~Wb5n~85|dMllR^H0 zVUS{Q$jdM=Fr+d>F{Us?F{Lo3Ftsp5F{d!6u(U8lv81pDGib8i;tDBBO$|@X$xbaw z2H6NQ0~B+t3=9k)LyJ?uu~*AjVOGPC#o)pat5eHV!<fR5%~@npAyvb$fU$<LhG`*_ z3qvedEprWX7y~0ip;|aY4O1;+Ax}61RBZxGZ3+XL+MsZT6oz01O-4UWrduo}MX9N` z*h=!VQ}c>7S#Gfur{<*H;wUIeEz8U=ExyH?T9%qua*GwLU?oG5ECU0>uNwV=qRg_y zl2rYKE){G623qGEj`V|`;YGqZAw5=-;qy!aFgqg=}rOH&hL({cj?1B3Je{Sf_v z%mUrayyB9?oE%*XgWT+lY@-~IAQ;D&rRJsN7wKn|<mQ;>WG3l@+*S?_s$%{0)V$)1 zOud52TO9H6pac>h&kIWILZAR-VqxTA<X{wH<YMGt2GLc*h+x)(sZVAGsbyeb;A3E5 z;DCj910w@N4Py**EpshPEo%*P2}3qh(Xkqq7^YgbTJ{>YEXG=n8n!H^TFy*{TCNI< z8g>_kSc4d*TJBn&66PB25|(DBqL3P%8m=1dET$UnEXFh@8-_vykVpzc4L5`r&QQZy z!kWS;2{L_44Mz!EHe1n_3a=W51?)APH5@fuHB3AV1q*7JQkWzeN;tBa!E9zph8nhP z=7lWa*ygR_1;_T1aE3gA8ioa&5S<IbX&`S~4RZ-cHdE2R8WymdSwL=v+sa)04s0uX z(VrTI1zaGV3z<Ns<<-?NmvCn@O<*h%t6^BcQ^T^55iFio!(74(7PqU2s$p2b2a<7N zh~=q;x?=)kp-wnMo?Q)d2|rj}SPes#Kn+VD16aRW4ReWL34e)DiExQXiD-#f8hbX| z1jeF*Jf0ec1>!Z#5PQIBk;U&83n<!)Kv|+l5R~~Oir5$!7;bUq<R>TQfHK}KP7n#s zez&+Xi^0h#FFCaclyizi85kIfL>L$tqBv4>3rZ?O64Q&=!QA4K#G;ar#PnNisd*_N zVF8e_?8*7LpiEr^Do<~*l%!Ua6mfzjQu32aDhpDJKnbLX8)PgGhyW$FB2dC9;s+}$ z&CAZqFVEBDE0P3BOM?Vi@=_~GZn0!%=B3<XNl7e8yu}!Qi@78*J&HZCq@*Y_srVKP z$PYzIAeRXy=jWBB7L}x?#KUA6vu`n$6@f|-a7Kd=av<|17#J8pb`*ok83s@~XXIdH zV`O7wVdP`vViaN$U=m^EVH9E%V&q{GVuHwtFbXhnG4e5SF$#c55Q~qIiMdJ;DR+Q# zcCnu(D=1@uTo)gIiz_}pH$SB`CpA9)7EgS9VJRdA;^T|tVUB^g4OARJSYTI*F)%QI zLaP{5qH!>C@D+hX{4~WuCZ?5^loqAN#}|Q$%OX%-ECMNu;)Z7J<oqINWP&0d9D9&R z0L2S9o^VD-5jaj6ia>?IEzab8PzjS)QVdQIkfZ@}2gISMPQJxq1M#UHDCHG{952Ge O!zjb3z{JBOzzhHw;mx=J literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + """Walks a tree yielding tokens + + Tokens are dicts that all have a ``type`` field specifying the type of the + token. + + """ + def __init__(self, tree): + """Creates a TreeWalker + + :arg tree: the tree to walk + + """ + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + """Generates an error token with the given message + + :arg msg: the error message + + :returns: SerializeError token + + """ + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + """Generates an EmptyTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :arg hasChildren: whether or not to yield a SerializationError because + this tag shouldn't have children + + :returns: EmptyTag token + + """ + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + """Generates a StartTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :returns: StartTag token + + """ + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + """Generates an EndTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :returns: EndTag token + + """ + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + """Generates SpaceCharacters and Characters tokens + + Depending on what's in the data, this generates one or more + ``SpaceCharacters`` and ``Characters`` tokens. + + For example: + + >>> from html5lib.treewalkers.base import TreeWalker + >>> # Give it an empty tree just so it instantiates + >>> walker = TreeWalker([]) + >>> list(walker.text('')) + [] + >>> list(walker.text(' ')) + [{u'data': ' ', u'type': u'SpaceCharacters'}] + >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE + [{u'data': ' ', u'type': u'SpaceCharacters'}, + {u'data': u'abc', u'type': u'Characters'}, + {u'data': u' ', u'type': u'SpaceCharacters'}] + + :arg data: the text data + + :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens + + """ + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + """Generates a Comment token + + :arg data: the comment + + :returns: Comment token + + """ + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + """Generates a Doctype token + + :arg name: + + :arg publicId: + + :arg systemId: + + :returns: the Doctype token + + """ + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + """Generates an Entity token + + :arg name: the entity name + + :returns: an Entity token + + """ + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + """Handles unknown node types""" + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import OrderedDict +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fe55bf9f3816f007f740445752ab975bc0c858e GIT binary patch literal 266 zcmZ?b<>g{vU|`Vf?~JixU|@I*;=nKy0|SEt0|P^`1Oo#@3PTEG4nr<u6eA;u&6L9w z!jQro%%I8gk`ZJ8<1Oy^__EZZ;>`TK_;^jmTZ~$Mn#{L&3KEmE6Vp@UQxZ!Oi$Esc zVoA;~N?plN#Kyn?A%5lQ7ZhcdC6=V>mn9bIr{(9Qq!tzH8yV{xo0*xFTa;Lu7w5&N zSQzD6rdXPq7@L+G7#J9&7wCuR7i1RbX66-_B<AGkS{USJXJi}YfCRxfzAQB_CBH~N mGbJxkKR!M)FS8^*Uaz3?7Kcr4eoARhsvXGX#UMxVFaiLiB}MfB literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14864912177a21dc81bbd8753f36a1e451555561 GIT binary patch literal 3073 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 N2`LI`iZF{X0{{oTlb8Si literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4dfeef4e401ee5f0e4e528328a3877a9bcd8605 GIT binary patch literal 626 zcmZ?b<>g{vU|`Vf?~HlDz`*br#DQTZ1_lNP1_p*=9R>!56owSW9EK1G%^1Rv!j!_? z!Vtxj!ji(;!Vtxr!j{6`!Vtxh!V%1%$@!8IWGLe;My+HJ3uGdQ2ASv#GLeIUfuV$< zhM}1;m_d`#Pm}Q$TWVf%eoCq)<1N;l#H7@ml?+9!3=9mva`X#|GRqQ6QuWIci}cg- zb5c@^iuH|*^^MKU%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ic1o6 za&#>Wa<enCjdDPOU>skTnwOGaq@S6Rm#CkdpIeYvqE}FPi#;UYG1%GDlLh2RkZTzj zi`W?$7>M>oN-D$`MIaNvK7bHx3=9mnI79M7^D;pSKxP(0&F92vJ`XsQQW%>Vn;26V zf*CZK{Hk<3UHlvsj0_Ac6jJh2ixu+nOB6~=GIKJEQx)<Ob5je7QVSFcit<bHlk;;l z8E*;u<(GKo7UZPnrskETrnnXr<rir(-eN3<xC<1<MPSEqz;uHW1k7z97x-zi-eO74 vFG{_|3UYcfI6#U(t}X&eBbkF_m`!eeN@-529Vpg|L9xxj$ic+H%)tx*0rG|* literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..853708fe11af33558ed39551eef5459d003885ec GIT binary patch literal 9069 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66329e68d3c5adc7b1243c9d015e6f7abe47271f GIT binary patch literal 21440 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb519dd1c31d742418d96144ba0378fe249cd64e GIT binary patch literal 1806 zcmZ?b<>g{vU|`Vf?~J+1#=!6x#DQTZ1_lNP1_p*=0|o|$6ox2<6vh;$9L6Zd6y_9` z7KSLM6xI~B7KSM16!sL37KSL66wVZ`7KSL+6sBMXP3}ZaMg|5h_sp`?JcUGsoXp}9 zh5R&y%)FA+^wgqa9fjP)lvIV%0+66aMt(tRT4_#BrKUonLUC?lPL4ueX>L+#5lA*C zKQCROs5GybD?d#kIX|yBHMz7Tvn&<KtmORMg3^*yg+zs-)Pkba;?%s7#FEVXJdpO1 zj8uiR{Gwbg4UOWG#G(>I9fj1q6hloN1qj~=%s0|h(9_e?)Kdt_0J%4>xIDE;0i?CC zG_@FPlu~(Ou|kCc)OfDUJg{_rQD%B(USbZ|gZ4@aAmPm1R0V&HocweRWw5(7HTAe& zf<o0VnGr-WFfgz&Ffgz)FfcfS!ncQkfuV$<hM}3UmNA{7mMMj?mbs#+gt3IFhOwEk znbCzIHmR1Sh9!kboB<-1%~0f1!&t*2$p9ij;*tz0OcD&)OhrD0ay5)K%pfs{j#ef~ zhFaDdrUlF;EH$ht%#sW>tSO8j_2LZ8ObZzq8ERN+nG5B@8A@1dn3@@b88lfEr5PC* zf?z?3CHfQ+i$O7!T3DKzmz)X;=Ay*B^weT2E(HYz1!zde8-Rm0-T)rf@sPle2ZcT; zxOEhYOOrDcN-`2lP(l-I3M{E8Bo?JAq*f#*m*i9`lw{-=rz%t+=>tb<e5QhptwM!@ z4JdBoGeHrqP@JEes*tJ21vV@Q>^z83dCB=HsVN{Y6ldn8=O7XiG({-b*eDnqDb#?> z($rDN%P#?`Eh#O?NiEg`oA&bm|NsAAf+DjBL};?zVk^!sDoIVb#R?9GTg*ABdAHaS z3kp*6Qf~3ar-H4Fhsd#lP10n$#R|$4@wd1kTH`^yTWnx8#kaU}5{paX%ZoBgQg1P4 z-r`LzEh<XQD}flXlA%a|fq~&yzJ5VbW?5oMs(x8wk$zf!PD*M~vA&V9zOk8^S-C}t zrFn5)e2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fo^7AaY<rMj;@74ZgxhtQ4UBDjN{8v z^HTDQ^fOcP67@6lN+3?sE2z9B4ClqC73JrGoeU~Kip4<bnuCLpg^`6(h*5x1f{}?) zgi(f(gQ-Y}fq@|zRF;60fM^f~r+Xd-28J4j6h=FS8b&9EU<OSlzn2OO3=q$0GTmYY zN9`@<)Vvh1e<6e*NCgK21A{y$?|=+rU@QXh;h75*CCsqQ1qvvTCH5ezm>d|=K!p>t zUy(2a149l-)&Khc^~_K^8E-KbL2LnOD*{<{i#I+c6_j8gL9c{lsW`IFK)IO(W@!~P zN2f40Gu1McFfL%KVXR?V$W+T*!<@pH%~Ir7!VJl!5)6_I&5SWjwJf!)H7qp@EDX#H z*^EVQHLTeTMSgiKj0|}!Da^qPHK5$f*vy#CP*eud3)ja6(wEItR0dL)!V=7&$y#OW zl3J2ll$)8Cs*stckdT>I5}%-umY9=M3@SDA74q}InHE&QL1GtFa3w&P33}i}T?7i8 z5I0R$aNyozOUf)xO)j~`4WZ+6QqxL`Kp{{BD$6w4Z?S+ZDFVgmEjDlpkH5uSkY9X@ z1*Gy8Yf)x;M#(M4c=X^EL?o%?{JfIH%se$v5Q7sG6Bi>7GY6vxqXZ)h6Az;RBPf9t zfs%+O+b#C^_>}zQ`1m3TP=WxZGO$A-ZUU)6vI!BJ95%W6DWy57b|6<5gVHVw69*HA JC<ikK3jq0u*9QOq literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..781b2bd598674b4228072320dfb98b31b65b6377 GIT binary patch literal 220 zcmZ?b<>g{vU|`Vf?~D;;U|@I*;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCQ}u&k)DO0 zCgUyc`1rEaqT<Z_y!iN)3`I-~3=ra1k$yo@W?5oMs(x8wk$zf!PD*M~vA&V9zOk8^ zS-C}trFn5)e2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fo^7AaY<rMj;@74ZgxhtQ4UBD xjN{8v^HTDQ^fOcP67>rbld}`kQ{z(-OA_@8DsOSv<mRW8=A_zzTwM(E0sxx}I+_3g literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c3abc95ecf3aa7ab950548a1b310a5a945ec8c5 GIT binary patch literal 176100 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 G@&^DN6BWb& literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,396 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + ] + +def _seg_19(): + return [ + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + ] + +def _seg_22(): + return [ + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + ] + +def _seg_25(): + return [ + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + ] + +def _seg_26(): + return [ + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4F, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + ] + +def _seg_27(): + return [ + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + ] + +def _seg_29(): + return [ + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + ] + +def _seg_31(): + return [ + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + ] + +def _seg_35(): + return [ + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + ] + +def _seg_39(): + return [ + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + ] + +def _seg_44(): + return [ + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + ] + +def _seg_65(): + return [ + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + ] + +def _seg_69(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'M', u'配'), + ] + +def _seg_72(): + return [ + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + ] + +def _seg_78(): + return [ + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py new file mode 100644 index 0000000..f2d0766 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.22' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39abf844761a11e75584956e4d56eacf83617e46 GIT binary patch literal 9916 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 OVdP=tVB%q9V*&vF5ueKd literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..278eee5d7bf3dc0528e95e10b92bf77a8c9ba8cb GIT binary patch literal 2297 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 UKiGjXbumZ-4-*F?2a^H|0DaFSrT_o{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0c64325a95e874873ec01f1f3d6c4452f36ad3a GIT binary patch literal 2659 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 ba>XqU8;H;BK;=U*$UOo~9E@Pdq`(3I^-*|5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f741f71b0cedbf8b74b8987f68fcd7be478dea43 GIT binary patch literal 4859 zcmZ?b<>g{vU|`Vf?~FMm&cN^(#DQTJ1_lNP1_p-W5(Wl_6ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k^MiUmxwMzN-_q_F0&<+4Yy=W;}G<Z?!F=5j@G<#I=H=ki4HFfzC^ zq_Cy1w=krzr?NLQNAad`q;R${MDe9?rEs?}MDeHar0}*dL<yuY2Qz5$Raq$b<R@pR zW#*(RB&B8~mSyIb7Aa)r7UZPnrskETrYMwUCMtyHWmYHzc)BQn)D`P-DJUo?yaf3| zlkpaRVp4H_PH9PMd}eMzeo=|vOGc1?*=})w40cK^PQAtJm{XLRm{JK6NKLuL1)|*& zGjmc?ZgKkMmw>oXrY~5{EpCudNM>$oerZWE$Q~GGhJ~090|P@ULlk2QLljdAV-$0W z5GY()7^7GqzK>#s`kM{vZ}t>nu+JHzI8yjh_*)pFI8y{t1X~!QxWFMHa*I2_(*<O& zTV_sbq9Y>%10rOQ!y~a+0WCoExWEAtl98&Alb@Uo4kU$4kg~k|qTIwBh(KOqZfc4` zQl&ykMyf($Nl8&=QfW!5LP9}eNk#%BNFBlY)r;Xlt&p6bSCW{S2QsTTGcP?SRUs!c zFI6EwO`#;UqC^KKpP82qb^^%gf};H7)Z$_VPZtG^08bZ9u;PqV1(<kAMq-IVVsc?= zW>IPi*fAhSL;YZ9X9sqJf-T4mu+Y#@FV4?R1;xF(CfFV#mAUyPgOWHX@<22j0|SFI zD7nipFff!bEMTl*s9{WDtYKcr!pKm=ki}HP5YL>#5X_*-<maZzQUua-iz7ZhGcU6w zKK>R9D5P$2m*!;_mZrvof>V>_7E5tzPFfKU0|Ub?j*<*eDoahd#a;qQIx8891Q{3@ zewFGM6lInrmZa*JB^K$Y<>#cN78UCo8S5LHnVFSalvtV<=f$U380A`~Selv`o0c0G z7#O4%=!fVRWESXV<`tJD=H%#F802PWWE<sx1i?7IEHy7BzepbxexSh7FUU-RvGocn zi?|sW7*s(11$l&lS%9%h1SyH>!911>$}gZW0?|ycFanhtC7@7YY-S8*&}6LARd7!& z0mm0OBNpZ7f;k`y!3hkKgg`kHgf*FNiGo5Sz92ItKCLJ}7sLQL5*${Vj75A543N+P z2T_p_I0Rujv_P%~Ifa24)y*&kC~gL2N^rb_%q(HZVqCyf!;r<e5aRAKg^<+Z5{1k( zgmW{C6_QJfic<4Raw-)vQgc$EsSo6E5QgWZ%wn)KOf%Typpq&rzeu4ZBeNKiR#Pi7 zi%W{p%+O@M#gtzR_U$b;hzcCO=FBXP2Zds4iay-iY*nJjQ3Y3l-QN-n3=B043m6tM z<cpOsE?`;+;xR8|$Yuh^+(N7&0P;7iIDm!*ERQ02B`CF|v?#AwAt528s5CVp0TvW! zIzYKSH?br+BefV5%-~E43dy|E+@#bZh2oNYP-f4}14)8%Hd>0&WGNB{r3X<^Dqu@b zEh)%MDG~t{<Jc1lPiA~#E;!IK^U}?cLQMiC)Q}V<gHsa&0|O{8fYLTN!8`&59AgS& zHfIq}4Pzcl4MP?~En^Ae0>*_5wM?MGA)B+vsD?3xDVwFpsD`PA(VU@{sbW<nUkNCQ zF*h?ZGK4eaO=4jvVaetyy28j%%go47RZ_#8#ahCe#g@%fv<+ff4akI9P!oHgCiaxD zr!dzrWHE~|G&43a=JAzqq=4K2<(Dun;DqW}SHqaXD$P)^A%$%rBO^l|UkO(VJ3?nT zsJ3RTWv*k6V2ETWG>KqHVGL#{Gy#bRGiY*DwJA74N?dRRfKnS$96J}KCYC@V4jwlO zC`nvLA-_nWC^54*wOAoBPa(CaD8EP{GYuZipmHB%s6ujnX-<klUVe!}QYyTVN0bbH zMW8aKN)1}IDwHQ?mSpCoE0pBJ6hm?p$a2-<DiPIUa6Ja8y}?qcDK9~>mp*GI2<)`4 z5>5kG<RBxG!TwNCE!N~N5&)$n7En2SOQgIgvm_N%{=}E$gD7}0bc@|T*cIfLTdb)? zMS1zR*j!yBJcC1uI6;Y#6=Vc!aZYM#K@q6x&}4xWT419&Qu9*c!NxPERwP5pFi=?! zDahEN^_x8?X@ZJi26iDv4n_e+4kji>CPqF+0Y)As9!3F17A77h7Dg^c872j$Dq-Zr z3pD|IhPMKxTX2Ri7ApZ&VGLPJkTg`ouz-0XL$OW?OA083LPbkhLDd^5wSwCkELBSt zf>Lu*6N^)^r3X;P4NA?;FGEigCHV?PXxdOy20TH4jDV#QuodX#MM{2ZF*u!M<mX_t z0zkS!xJm$$0P^xnppjoC4G{q)w$v0Ig{0CFuqjEE3c0C%nrx6_gdG%ppgOro62#&F zMWlEU*hlf;qBt`z9hMMq6w2&SkH&*y5R~E=*f|*a7(o~{o}lVb;t5pNfXf$1g#@aM zz+n%nkeI5P6r74u6SKh?2~=}{G62XwNI4SZd8{#znWm6gqL2v95MaL)>nP-xWTY0A zXBMX_fPxhz67up(GBWeh(aiSKWGVtBOK|msBLujTK&}KAvN@nY0C|dmy-Ex@ks_36 zGP(I_GWuz9gBnbrwo!ciEw1?Z-29Z%oYeUETRidcg{6r(P#O04_>}zQ_;_#=1zgZW zA`To~%Ahz?1rcf>0-UQ51gN1<1d0%l+G0>%<ltms;$q`q<>27p;8Nh=1<S(Y161CF z5&$?pl0f|&##+WoK2Xypg{hgTmMNSePlSb`gfW||NR5#J1S1*pEFu_cm_QXNC^ywI zSMrpw)G#+Q)-pm>vu1M@g@DvDGDI@uF@aUHEo5M1r~$<>bJcr=pwvW2x&}2Gic*vF zi&9ck6reRAC>T-{Kr*1R2q|*Fx)SqJ6pFz0E;#GtmFA`vWhR4_!wpI-2DiXb41`BK z++YPyNUH}XppcxH2g*!IsS2Q$6gcxj8%Cg(erjHcLS`}C7?8?Dg|ft)Ot4#ZV2(;i z@XOCjO-Mj;x8E(sB2D&NEcpegdAHa-{UN0)2gnjohv61$aY<2T!7b*@ypmg7VTn1V zsSp*c$vOGOshTXecnUI8Kw%LNZe%kTWTxC=hYH<d0U3c-#1;uNFff#X(j}<z!@$7; zE>`&%*?4#unHYH(`54(4Iheqz;7I{gh=U4sa8d{Y_W`mPOBk}4oES<NvY4G1Y8g`) zYne(I7O;SN1~p6znQNI#7#6VBFsCprWU6H;VOYSnkfD~fhGhY$;${_N09D2{EDJb5 zQJ=yR%%I6yx`Ba#K_MJe<$z-k6!e5*9oDdh#Wbv|1nNRPYM2w?>GG&yF1#a!R+Pe{ z3zTfYRUN2^D9H!g4oPUBfK>qZ8$lrn?vSNclpsZ4<`PB*hFgr~Rm`fzTz;CIMc{@Q zyMMfMkgH?JEjIsn*9d2yTO9uJ;X(d>K9NN_pdytmEd><cMW7hC#R|5%$OzPEV=FRd zU|@*i0?Edw<s_yTM{$DLx%nxnQC!e?jZaG{G6m&u6A*!x!(|v47-oQ?7gU6TYEKqM zK1Lo+Q2AQ~l7mMos8|9O2jEC`V_;wa<!w;c4iq)v40%Q@3?)q2TtyCy47H4m3{@gE zj9JVj%vmhiOhtNmOic`+Hc|>>En^)csO<#G%b>QCCR5dU1xOK$6p*0E1P3Oh98Lul z-^dMrum(_ho(RsZV5Q*xE~s42Q%5Vg6$(mAiWN$Wp_v#SktwOg;J$HjNn%N=jzV$1 zLV2n}W_n(J5v00K&d*E9EXmBzgEhv%_JFJa)rD|lz^+4zWIs(-NW8K^s=^{!P`Jy1 zW75^n-_<WflL;JgMM@wEv<LxJ7oenF460WdIG~LfMkYu_qA6Ge>a&50{It@N(xTM( z_##lu6oHHf+gc<IvWNlPsV)NLLU5a^2wYWz%4bNM3lx*!Obd==NF9Z62$%(`0B&*E f<brD!J6=#40SSRxQXGsNj2uh~ECR6{N*odZW;WG~ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b86a9f4d536f8be97749210003a8e240959351dd GIT binary patch literal 3758 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 QFmizE9!5S!E+!df0QjAfC;$Ke literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f333eac5d592688af99ea6bd174a20bb8622b78 GIT binary patch literal 2182 zcmZ?b<>g{vU|`Vf?~JkFVqka-;=nKq0|SEt0|P^`4+8^33PTEG4nr<u6eA;u&6L9w z#gxL3!j!`t#hk*N!ji+1%NoU+%NE6!%O1s^%Mrzq%NfPV$l%V9!kWU?!jQt2%G%5v z#g)Po%%I8s5@d%a<1PNgq~iRX(vsBp%-n+fq7uKCj3C#r-s14dPtJBqEKa?}>6c#u z;-sd4nZA`E&Mj^b8IqZsnqOLSi`OxyC^az!ER&j&3^E&rnPGl#VPIfLWr$)-VTfW% zVT@u<5lCT4VQpcIVo4E9VM}3eVT@u;;Yi_ZVTfW&;Y#6dVTfW+;Ys0bVTj^L;Y;Cf zVTj^PVGd@{6uQM9T$!7bnU@W6f?H-zYLz;OrI47MoLXG0P?E2ZsF0SKld4c!oSB!d zPz+J5VWg=S;+G5xQ;^$0G#dj0gEJ_6H5eEeN*ER})-cpC)-csDFJxh4C}GNCUcger zkj1)?F@;f*p@t!zHH9IVL6ga^2;?bEwjz)jw>aYCGxIV_;^S{I<rm*#DM&2IxW!sr zkds+*i@P*0v#>NZJ})shRg>iwOL1yWS`iNe1H&zjk_=FQrKa3sFM)*NN`@jK1_p*- zmHGumnPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@ z2I&R*A^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI($C3H&IW~zJ~UKde7%Co zB2Yr)1qBDlUkpqFOjQzS0j&q~Ycdlk3>g?0Kq0{a3&v9n3=B1lDGb@1MLac(d7!{! zsAVi+T)?=Hp_U0MV^qVK!kEocWK_dc!)VS>%TzI`Qlx}w0doyQ7Dxx{LMBFraE81R z7KReGY_6g`j0_-H!?1vTAwy9LC<>q^&4ZX+!<5ZZG!JU(gc6PvrW%GUPBDgN#wNx* zz7nn!kjYSf3F888sP0WQj43SA40%i`tP2?#86p`9O(GaTrWcxogK14Rzamg(s8WL_ zbA|H6%o0$F0;RCz!qUv5R0UA@DWv5WDX11#iKrGUWELwVLh=GwDmCRLC{)vD%>;p+ z_L@9Jf}r?k0mXU|H;Bm&jfo;Y5RVgNU_2;>Zn66ZyA~DY7v18?j8Dvs2T5e+r5CX? zFff1<Q4uKIZ?P8Vq^1^VG8gfK#KDGhq~@i>gDn81C~&eW5(XL0o(OR@h*PWria|CZ zMh->+Mh+$>CMHG^Mm{DECKhH9Mh-?6CLSghMlMDL<|=XYL;y7<85B4mLqIer9e}fv z9ViVjEMQp3P%Kfxn8H}Yki`Uz3$Yr81<VT>iuFoZz;Of>FJWE4R>P3R4vGa(_-iuz zRS7_XGB3Xb8jMxa5D`!)q^9U7B$bvZfMk;@6>?KGIc{-g7K1}5HKm9Z6cC_XRwM~x zfigKHq}fXIK&3{JIH-hUgajCR2o<H~q$U=pnt`$bDCQU-;ls$sh#3x0wb;V}6q_Xs zS&R!nsgZdhV=#jzqn{=V*d^fTyTz7SOu#usvJ4Ciwjif~vm0ZTBzjc9eU04_3gB`L z;fQ>>5(aRY#=H;|F|663x`5G7lMUglB9I<%5Z&Sc6;WU(f;^*%HN?PS46dWVg$5{` zWH20wlzg$fQx46YMN$ZNf@(WR;IU$JWf4d(cDLQ)N-9cC%m$|mQ0-F;ccK)!6A=nE znL_+PF~tQc*g*w%eEco0`1suXl+v8k`1o5q@$rSFi8)Xi_W1ae{N(s}aM@WT14?i5 zAOaL|;Gii|0&x+k49o)MzamZs1_n?HD+UEFD8q5FaVc}Kb1-wTfaNr~LH4GVmXsEy z#>W?dQUJvNqM)qI0Iqx>X&s!x!NmfoL;!1sWO}e=U;<?0Ee;!qFYG`Wwiu+Ahlzuc IgGq)30140c8~^|S literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PID”) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# coding: utf-8 +from pip._vendor.msgpack._version import version +from pip._vendor.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +if os.environ.get('MSGPACK_PUREPYTHON'): + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker +else: + try: + from pip._vendor.msgpack._packer import Packer + from pip._vendor.msgpack._unpacker import unpackb, Unpacker + except ImportError: + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd60c708ec00136e054e34b4c04d4a87cadde9ec GIT binary patch literal 2078 zcmZ?b<>g{vU|`Vf?~LhXV_<j;;=nKm0|SEt0|P_xH3kNT6owSW9EM!RC`LvQn<<AW z1Vl6EFz2#Fu`n{YGo-Mju(mLyu%@!4u%@szGc_|uv8FJju;;Kvv8A$Qu`l3A;aJF6 zl#s%Z!kNRF%N50y%N@m?%M-=J$dKn%sgS~u!j;1d5(nGBox_Ka4`;~JU|~q*&*myx z!N>rD*i4CJ$YY9NNa0E0ZDEKKNa0K2Z()cMOc6*CY+;BJN)?I{PUVggNfn3^O%;q1 zOJNUY&=h(J@~tN0E%vh1qT<Z_JWa-1j9QwEx47~Wb5m1FN(*vQlR-*gm>J3_R$yRY zNM(p(Oks#(N@0v*Zf8hiOkql4ZsCYxX=h+zh+++9&}6yA?pje2Qdy8%r4D5%6r~mv zr52~=l@u$aR+K1|R2HNvWacU47N-{^CTHs<!)yT2tPBhcAi6k=fq|ifp@y-9v6-n@ zsDvqnv6-=nv4o+9sf4+isaU0iDTN6nlEPfW$il$Pkj+?Rk;0PASnQO?#K=&>lEMm- zEnzKTt6^wnTEJezP{UZmw2(QNL6gm|N+3BuB~>A}w75he3FMfPDxs9bl0>*jQe{bM zaS<Z}1H;RD1_p*IAr$onb%sXfnjE*dGK(|wic1pnl2dOnXXcgM;sklzwWuh+=oTy3 zh+AA?i8-aIP@&?|g4CiSkQZ;U$H(WTmdD3yGT&lO&MCgd0<z#13&;_gjJG)B<CAj| zi;LsqS2Fx6)GsK?EK4j&)h|md(of6JNl7g#);BWNH#RdfE4L`IG%wDJPq8q{wM?-z zH8D0VH!v_TNH5S2(J#m>&;>g%Cr8)9AU8WB+b9Pl2*&Ycsd*{+Mf%Wa(2tML%*!l^ zkJl@xEaGKgU;t&4Vm?shGjcI<fUy`O2V)gKG+OmwK481W5g!jqJn`|jxZ>k;^HWN5 zQsd)q@x;d$mL}#vW!U56Q}UDJ<H2U%;)QxJIW;FIKE6nZfq?-`XfhTFg4n_!0u)f7 zELqILz`(%4$ifH?x++dkP$_^y$}dXDH`qPE(b+pbAT-D|ATq?m-%peI7F$4Ka&~Ib zE%wqpPzp=B#Ssc-q!wv17D<9~KU0wu$OdT!28LuNkRKTs7(ljwtn>zz0CM2um&Q=T z)W=xMT*J74v4(j8Qw_sH#)Y8rfH9aslc_3#OF=<F0c4p%eo|Iya*0Aheu6?`UW!6_ zQD#Z1LS~6VNxnitaY<2XVr~K#Saon}s)7|ba;*|TI#Y`h6w>mG6!Hs7GV}9_^}ve! zG?~Hfyu}JO=oSme8=5S)81rwjK}@^FmR+7$lwN#`4J4IX1P(n20S-G^1_lOskVini zVqoK9ECPungHkleyC6S<vKiQ~0x-Wa_JRD#un^=s#;S0zQ$TJ+_gztHNoi4@0@&sh z1#m(q!E>5SV84MKq{&nS3h5$H*#dDrI4OX<aEldWev&506Cmd@uoWqRq6_8)kn=$p z>;(}928J4j1q=%rYMDwHYnaj)YZ&_=-sk~)1Cjs~67yhwNh`|Fg-4AZ#Q8yqnZ>Ea z3JI<iB}IuYi6w~%3gsE8d2nS4$@zIDiJ5uea;zv3;&VuhAxA63F02u&$#jdQC^az! zocuJIi$GBX@jNIJ&_jR?l75XqK>&_Nb`HiO6;S#Wza>+US)d2a!+Ov>4B~^!^deAz z-IBwmB()+r6_V6$aVO{J<fJBp(_InBd~p7{#gt!si#;{3EVC#-?-p}<Y6*6`(h_rW zk`j}%A(08sPEpd>Y>fxSWol8BELKT~H&cslaeL+#<QJ8Ii%W3&07p64%ePo^@)J{T zv4Y6rTP!K1xdpdaL1Zyfs38&$hYh40vIB)gF(}M<7&(}Dn8kQF7<m}Qn3x!O7)2QQ T7^RpwxHvdDcvu)&m{=GA{}vcT literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ad42a4832751d3664812aeed0dfe8d4b220433b GIT binary patch literal 227 zcmZ?b<>g{vU|`Vf?~D;)U|@I*;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCX*)fOOT3} ztPBhcFWDFv82mIDZ?Tu978Pga=dENY0*Ql(UxoSwMVV!ZC8_#liADNp`8g@6MaB9? z#`?x)W@hCUC6?yJdGRS0M!A+LmZm1grsW0(1_tQ``XTxSnFYF;dBr7(IXSu(2D#Z8 w*+w}aK`@RlOU+BkFVfE~PA^DI&eo5I+O1bmd5gm)H$SB`C)Ez*_+pSd0pQm<<p2Nx literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afbf29725de55c3ab3a628384004c2c28ca787ca GIT binary patch literal 2183 zcmZ?b<>g{vU|`Vf?~GAkVPJR+;=nK~0|SEt0|P^G7Xt%>J3|UX3S$dH3S%lmGjkN9 zJ3|Un3UdoX3UexBGjkM^J3|Uf3Tq2P3M-h;?9PzFmcrh`kiwqIn99=362<DykiwC| z*}{;*nabMC9L46&kiwP1-NKN<4K|V8ogsxMg|~$vg*TNQtb@ayA%!o6zl9-%Kb0eu zvzaA|D@7ofK~pdp=0Xt72y>+X0|P@ULlk2QLljdAV-#}=Q!s-j^DX|+yn@8!Y}bn9 z)Pj=C{Jbh}m(+ry)a1mH)D%4hh0x+u1-P6-W?pegYGR5)NxnjIVo7p_LSjyiLMlwF zLP}{-W?s5NDcHo!ymUQ3O_p06@$q?yxvBB-x47ctbMsS5b3kmK`1r!o#2ly$dwhIK zesX;LN`@jf1_lW6t60CFD6=fFBvrpGu}D8HKPM%%s94{~Sl`&p%&gp^#L~PtFFwV> zDAzK@($vJ*wA{eJz#zRqKSaMEvp^T*)Wn<|T?>QU?2K%q9FQOw$Cst%rQ{ds=N6}f zJgyISez9IbWf3U2K)9HRfq{X85zNOPo;)bw8O)%`bc@TWG%YQ)$gMOd$4`^F2xLSN zGsr(IAOh|)h#%QOVjK(%44`xbvkt^3+B#1E(h~nPm&B4pB5mVjU|;}Ym~9|7cH3|y z76C|N2}{f=O?53Q$}g%?!ALC#Nmz0LB?I)p0C^e`4v1g@hX^RY@q%&{DD*fOi$Hu7 zH-f~$*-i!}0#cY-7^0X{m{V9<7@}BGSc4ff*=}*VR+JPaf<h=66c3>M0HQ%gID_l} zd9#MGh9RDzhN*@jo-u_Xm_d`#Pm}2u2P6@vrrcsp1(~7Ae2b+xH7BhI6zxSI2O_y1 z<Zw_r&&<m#iH{conGA|?21Yi<Dj~QN^y1?o3X(wy4CEFN4Z>izfOMoVg3^&+l^n!& zjU-KlqSWNn%(B!J1+X&|QW8rN^}tqZG8XZHk`QY6-C~cAFD@yHj~4^E0_0H!#wtN% zH-KgRG+EJOgdb!WC_uobBM~6q6>&2#FbIN-1UZv~k%I*+f)X(xpMWC<WC)g$hBpAE zobkj+Ii!{|pzI4RWzao?GkJmhAO-RVC}=nsi$Hvme8C6u1tN`Cb))hXGK&?85;Kca zQxwWGQu7o_DhpB-^3xPD^9o8!z_ABXQCwP3kY7}inxc?YTB49yqF$^}2Fg<)xzaqi ztR5Gaf`WnqMnEB~hi5UcLO)Fwq5}eyO6A}I!BPa`lN1nwAdmZ(r52^-<d;JVgNYbI zAP*r2M`m70YI<rB!ngUQC7|FbO3X_KhZD3^R)B_qLbR@tmX@)hjsl1>(xhdG2s1D+ zs3L_3i0`M#4Jt&SbtAYoC<2wyMVt%_47a!t5dkizz<C0kq`<*>ix(w$ia-V;<tuQ; f1!b;V95#@8(GHY_ib1(rfCU7FSOho)ScKRCcv;sE literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1921c36b359eead4d0e89fa0631edfde1a7b3e1a GIT binary patch literal 24555 zcmZ?b<>g{vU|`Vf?~JkTV_<j;;=nKm0|SEt0|P^G2_pkT3PTh_3S$aW4r3G}m}ZJ% z0@KV<%&Cl7EGdkV3@OanOhqm!EK#hfY*Fl~98sL9Tv6O9tSM|Q3{gCJ5-IE;nN;31 zrYQDQz9`NV4v0)De=1`NXERgLt`x=;t{j0}!6-pShDw1H#uV-xp<Ll85k`h^hCBrp zhE&mPuA)VZ3?P`on8K4Ilq&*~jbzAUieN}#i4t>XNa0Q4Yhg&?OBHWsj*<Y|Dwe{S z!k;6VD-|Wd$dDqCBG|$ZC78mPB9tSYD-$J?D;p)7D;Fh~D<37Fs}QA-s~Dxo2=c9P zj#932lro4NrII2NrJ5odrIx}RrJlkVrI8{MrI{icrIo@QrJW)crIR8arJEuVrI)Io zYLLd1BAFu9!Wd<kBAp`B!VqPYBAX)D!VqPgBA=qr!VqQR&XA&*qSV5Wq6BuQsXIf8 za*9d|Ly8KRZ<fLo%%G`SrRSEIlarK~oUKq$T9m2~P+5|ZpQn(STac5Qo0?aWSdy8a zr;wkfkXxKykeHnP5)^lSFPRw_7($X6K^z7K1`y4}z`)=Pic3(W)-Wt!SjZ5}pvmZ` z$#{!3vm`aQSd;M<W6DZ~B31?lhF^vH1x1-<i6yD}Wr;=lY56%RsYS*5M#lQaW@cvP z7A2PE#d+~57Dl<2DVC-t#-`;41_lP{1^OZS1(^l9nR&$}i8(pC76!T58QDfTAVDyW zFH6l!$uH7}I#xdo>NmZD%3FLXnaL&bnI)-3VCV3F+zN6u17i_80|SE_vA*Gi8==Wq z#KOP;@e$ZtMQk80$TT5@>9+(6Dhn#(%TkMqGxPJ}GxO5&H5qU5<fWG9WEPjiXJqD; zfcQ?8C8@<urJ10R&}6*D8(dP9nU@X~NQMS9m;!}8IM=8#FfgPtL@}l?L@}jsrZA;2 zw=hOAr?8~3wlGAoq_Cy1w=hJprf>u^XmZ`+fEeiM{~2URGT7$~3=AL|WFR=|bQl;I zY8Z<YN*GEQYZ#jun;B~u;+bj~vX~Yy*Dx+*WMs(WC}C)30EwnRqnD)!6q2`?b5iqe zu_r;?e~T@#pdd9bMU&|kOL1yW+AYRnNce!_9vn!wIO5|o^D;}~;}t+51xhmvj4X_N zjC@R0f-slr!PH=Ptr-IYLkU9-V+mt3Q;|pw;{v9I47H4TLSQlGW~L&w5*CmzY8h)7 zvRD_eL3{vnH~THF%wljt%1chY#g&_yn_pB}mYG_9i@hX22^1N(I6+imQBh*$Emjb- zxJUpLzk;CRjHw6|#YMs(0kE&Y1StM*v6h2U7$|az!9^b<7Z`FdR`J1o23CSS#ewwH zFk~?-V1(r$Ca}G?SizyI$q2C-Y#*2aTgs81T2hvnQ<@5j!(vdZGB6^ABuv&%ld*^o z<bF0#4CE!|rpCwL;);*Y%}*)K0kL`F;|og@b09KBA|UTcfe0B80k#f7fGjTJWnf^C z2gM<X$HB<O#=!;_(`3BG4o=ga{wV$gl@;K`2Fg0=kVFJd9GZ-`Sc)^NQo$Su0W$Iy zhfPjmZc<93ogv5;P~t68g7|>TsWdGuwaBeBC+8NYe`$$-noD9y;w^#DJWxp$1_}+= zqN4nwTYLeD$=OJJK@i`+EVU>tC%+t`gwwU6q$m-jALMY?ijt7Zg4CBF$G!vw=1Y)k zUxK`z`Ja)2AsNI4IR!+6<iS4D0A(L0P?D=*&gLkRs9~yMXlATo%w`K_fU`M*8K6lJ z>_<(OTg>@MS+^KVZn2b97Np){Eh#O?!3YGQ_~eY#<m`BmlKA41qRiwHKTvRhLWqHp zhmnV=$cTY~0UpvIH-R!0*j)(>3=EY#B@7_f)G~%M<k_$=lrUy<6?uSaIYx#OredcO zh7x9wd^2M$V+qRw))dAPHV|Kop@e-Q6C*<&QxgNE4y<9!;z(i2W-f{;;Y?v}W^7`t zVGL%_WbvzNDlN{;OIOIxNl{1w$BaT|UP)?ET4HjlLP@?tDL7gbREw<@N-{Ew6>?G& zQ;HE1Ag!sO=qgsoOj9V%$xH@`WELxw7N@2tB<7_klxODTC?usS6s6|om!+mCWacR( zDx{T`fa)!1@mi$Cz`#(YlAM^AmtO+2F|8;+S0T4FrzBGsl#Lbgld@8iOEkHP#26SD zZgGZG7NkNF0dqj4@hvup+i!7{Cl=*p=A{?kVga#=3_yzcf=csBGILYIA#%4kz;#Jx zRq8D+MEcTXD$)ZfW&sr^;8=zbpvbx<8lRq85}%S-k{AziS3JbFP*7w_fKn7A6C)2J z9}^2B4<j2B2O|d)2O}3F2V;>9a`b{qY*5nk25AG8pd}0o7*iNam_Sig!?1vPAww-w z2}=!A8e<J(A1Hd5{Hl^%GK*4^OB9k5b8^5zi&Dp{7ej+fLsKEMSRo~~peQvtu_QG` zM<KL06;}Q0K_XE@Qz5?ysy+#%A+NY3H8Dj`leGv`Di@i9ye}D$nwOH9m+k^JDl<P1 z7Hlj<sfj7K*dc}`X)@npD=sNYP0YQ;mR+7$1PXFc06{_xl<6RK1{*|uI>^(YQW8{S zFfp=$LI;%2;fWs<GN8l{4xI>aEs??u3Wr*z8m0w|H4LDdtdggO30z|^hco2KurQP` zXLA+VFoGL?B`hgSpo9%g@JtI>7cvxul(5w>*Dx($U&zqR)WlfB3`+D>JzNS33JQ=C zM<Fo}nzj@`QLB&uDuz;167;yhih>d|i&Kjg65u6Gf<k#lY93sfLUMjyNn&PRu|g`S zEK&fa)nYxc*5K4s1*_zo#NuMB1c+U!MF|RN`9%u(1)v5RRGD9uFsK9r#UCj7r{?9C zrf2AZ8etr_IAHp2v81J@rrctWhlFO43aDgP1w|NNe0qLKJlJw@@Po>;TYTX33K!I5 zxy1(YR*@q}4+q4Q)S_F=MX4odF;-;Hz`&3XiY`!P$-oY(2*Jslk&lssk&h89kJ7dQ zRj}Z;%{k<@4X9Palmcqmu%s}-A#*BA3M&kz34q%>jG*>T3TF#L6k7^c3U>=b6nhF! z3U3QT6h{hQ3V#bj6eqNG&XppRBHY3d#hoIOA`0p~r1GXQrii78w=hQWf!Pu%k}Zr; z{3%i?(k%>80x2>nvY=Lds$i5*ibjfDihK)WlyHh>ib9HF3uBZ>idKqJigF8MlxT`} zib{%V3uBa6idu?#3qzDRxUH>I<ifzfkm$t4zz_^h?VwBu3qEKXNi0e)1vR^itsrT} zsvxl_F;^iiGbc4ZCo?<M3Y;83NzN@ZCsh|D1WR%miDe)I6ZAlNOCwJ+K_NG_BqKis zl7c{5Jku143sRFa(=tK18fLQsNPV$FacWU!VoqjNYKj6V@*ycWvjkl5T7gWmN&uxB z4b22t@+vJ(Ov*`xIvncI%)An?dGVl{9O2kda1matkO21x#FZec!Adm~^b|BwQqvMk zb4sif5^^*1Gz`tO3=ND-bQE$EE1;z$RH-IP*d*oW=YZ;n_?*n*5`>kWX$mDprKvj5 zQVLdpDS+E^pjrpo(*fy11d)G9Mru)cW-&rvNj|Jk1g@Boof%S8nu^6OMTzBvol%rn zj^qe%R)+_GCUNd5E-6yb02jlV$@wX%3i)|3ml|m*BvmS;q$cNs%3pYrDbFm)PzVii z)3s1Y&4b7(XcVO;=jZ08=B1>jAld6&T2z#pSCUhyqfnBOssN1{P|QODHL0{jA+rQt zBPVAh=B1~mfP9pem{XjpkeLU!H7_->2wF?)DJTTzD^%u}D&&?Hmp~I^CCH%EiULrD zUy@S^F4eMAQwu<e8PqQ=Pb^A-8<w1(TaZ|inUtB6SyBm2dZ47O1@n*=v_w=W&&W*9 z067>@lPTnvr4|)srlb}_8X%Ce6KV=H0fQ<>P_l;Rs`!lj{A@&QhJ(s$q&$>aqEMWX zUkYmQq=M^JkXA(O!HQh4R58e(;3!B`0ChzbV0m33F|8yOR-1x+4eh-u<R%s%%+dhW z0f{-q`3lA0&UsdGejaM#Lw9;XVrEe>jXVI#HK0*}?9@tKaJNGNY#X(_0!rGj7)6A> zD=g81TZEw650=E?xw|N_91&!mX`mp_ELQN#&r3z*E*)gmkQ9Pc_#yH;I8&mg4v@P_ z^T63H9@17txK0C+&@@3!rW9~W#^yo=a4J9~S%iy`ia>QpD_=bUHIhLEELwqxaDq=} zZe~fb0;uc-MGm+eFHg)Y0VOJEai5~6pkSboo0^zctWaE8T#}lrUaa8h7ZUI57=Z{P zgo|K}7DQJoK_RswIThUOfV5vSOF)5`nO9tzmX?{EnVMIE&>opz3d<qIsU?tX2d>gm zK}jCm{DC+O<V3K0!7ZoKypp2Q;*!)9h2s3uqGT+U3@8kWON!!iQu8qUpPN{rkdvC1 zUXlR{h2oMT<U-p>OUu|$*APdjX66xLVp3)v(I$ec8zRgEt0UUf+{6MR%mkGm@Hn+n zK=>S7oTgSJf;s@uAWBWl1xG<DJS#w20H6vRxtU=FZJ2-xT}aHO7Ae?58^EbW8X)!H zmWqx-QDV8R8>lwW1ltGF0m`%apne-nD<bYd(gj8N$*IM~8u`%JA<l`#`N`R-C4?M? z#Wm#_nK`KnpjsT&8A+vS3bqO$WA%zslgl(f%@8duBZN0VZp}<n0JX7`O4Cp^gXEHm zQWLY`o(74){Hq6ULnW1_p&CXYTtFrug$;=7R|FcH2+92a|9^clXhaIscLdR(&JU<J zRNTkNz)-`H!jR2bBvOLhJ>*Pb$mS?gNMWkwtYHMR4N{nE7~+}p<Uj*vS**>B#ZDz` zDJ-BaPz`7ZkUfPJBwxY-9{S@f;mYDpVasMH$}8ciVaVbH4-@j{ae&x04Dq}v>@^JW zd|;BlhO3|>g`<WcUH~)#k|mJMQZ%nbFohFrHdDcx5}_J~EP)iRW~Lg3c;OO}8Wyl= zqBS5rVl|vK4DsSMAlFIMfJ~LF0l7q~hOLGnUb=?6h9O?2hNp%hUbcp}h9O?AhOdSp zUcQFEh9O>|MxcfvUJ>jHr5binI80zHQYm4nVQ*%fz*wwO!j{4fb_FX`&Y^^*h7~O5 zP{NkN1D0ch%Egqh)Ubi&VoKOjc)@ZoeHAq@RTU*{DSRNg5|$cnu<EW7wiJGl2zbm# zz^_UVR;_``Ohk<V>14yxr~+tU64apvcZ@TWOG2s?(b~=lkTz5jqTS)9$y}t(z`*bl zGywe)G}r)6Bj6-b1#WMH+s|-)#kq+&IjKboB^il%=#A`5(7a5QbONZJ2R9+$t$tW5 zqe?abGLC{nS{Wt{ZW!QDWC1k-p$6RFfQo|JUJ8jtsS3HJC8dcuIhCNAC#SSHvn;hr zDj~I^1iPu4%7{UTB3p1LH6E1hGV{`Jalo8kWC!Z@8iQmx;bm44XawdKJG8fPi@CV6 z_!bXzWC=WQUt|i>zynnf4;tTrDv!^+#SapOjMEk5XXcgM5{L)YQjh^2aL^Z7fwVK{ zX6D`Eiih`oZn1#6Ft=FZixSIkamK?E$SwYO)TYKQ&iK+|P&cr+<Q5mWw*&V7EuMI! z@VX@g;~~NnWGFPSZt;NK1g$xtyd+4icZ&}!2d;@gwF^`hTGv2%pil=5_49#7AyX4` z<MY$fic?E81tFu-fglfZBD}@{cQG@_cihM>6@+q-9SToxw>aS8z=swL{Ai(iiv#2+ zP-3~o4U&R+4$Oi1jTa<?@ETYS<})w{WJXSE9{LCdXaxKsXapk$RKRj^FtRW*fd}ST zz=Lz3p*c22Hf9cHE=E2k4kk8EHYU(02M41NBNrnZF32Rp$iaw&nYb9M1Yx}e%xMqM za32VR%k>fl1_sdlKrvSdV-sTuc)Yom2{d|}1ui?YSS3JXxlGNB;vjWw*(^mSCG1V0 zNf3?{#%z|Nq#A}SmK2a2M=O&pLk$B9Ll$cdLl%bx0~13$YYM2u=Kzbc)G(QY#8|+k z7Zaq;(c~=h2gNd<V{vh65oq)YJa`Hope*7C<*FbM5e6bagKtI3AXYeN$etOTNN#cE zfdU)cye_f^NrH#?zy!F|a%Es(kYi+EC<c!jfrmfk7+F9e%qYOf##F@%4=GT#h7bFJ zDnu68EF@@(0PF{lKS6$Hl3)P)1<H?SN&ydxR%t7^r<N2e6lJD>T0)@CF1UA5kXTew z3=@H5VLb&uP3EFZkb}XV1A7U_Y)pJ|eqM2DZmJH*8z4t9Fo~f=F;pJK@$e`Hje>!q zxCHF*X2xvDG>Im25!hmQAY-2kDspFFU@!z(44MUCV5|~{hZpJqAAZYg7_t~s7+RSm zp_Vfh!Q&N&y&en<3??}2O+^}5#6Fz|8qo#K8-u3l;4{bIQc@E#*>;N&J$K&X0+%%4 zlw^)%u`t}j2zj`rpil<I2skr=X3JofGJ=x^XpFc9oOR;Cp<lyP!vx|Z0)qJ#M|=^e zom`d*i4Rb?XhPC<Q7tHIFlH8kQ!|(VC+Qjn1_mpT3qj-33{0S+fs3(<5AIH|KjBUU z=>s_v?8H0Z0c=ogfLcabOcD$=j1mkWXQnV_vlc0U@@5S~7ITpiC|`r7W=mMXxt#@^ z+Y>-K!MU9Up4&lFx-8(_&IHcwEHzBr47E%ZK{ZTZJv%^iKUwTGOwCNS%%GBC0cQ>K zLdIH_8kXX|0EQB-8kQ37W~SmfB|IRTSQxSxYgoX!i?N2OgaOosvtX!YD$EE6P0%uA zfhLl{fho?A%}{g$Y$p@Ql_0lk!paq1^wI-V%oKrg8F-BP7ISW5MNt$e`+;g1NChqm z;!1*uN>BmA3NBzEk-$@wnwyxJ7Y|Myw|GnP!C?&LLaHcGhZ8-f>KPaq96>P!N*WA| zBFr3&EKHy|26zF)%*MzCnsNhI1$>Nri~>v|jBF^m8=5@e5ejONfg%+gp%Gl5dFxuH z6vkTS6oy)s8c^e$2{b1GnrR0`r6fZwE4c7tPJtA_%r&ej%nl4GjM+>@E;X#REEBl$ zxN2BaSR5EqShAUl5>i-eSX0;>86+5LStfAiy@SfJXEPPet6@#yaA2rqE@7!<0yU+x zShHD*CX}$Ha6)*^%%DhIzz&Jx37mNwYFJaa92io#vzdx6)v%`UfOT^~b#rF36rBS# zg2B2uLAob!=G8#;FlRGOU@QW;4Wf$+s*5|DWdc``AE<#0*2fLi=TgI(!VlIX0}6`? zoOwnytSJIu5xo>aux}J<SW|?+A`U6SU=h9=))W!2$h;DsS|+R^$cz?(poGku%`$-z z>~~SHD|pkG#27%$^BM-Y|2e?^7t3avz*NKrH(eYQKP7w%_){c69Tre5Eo25QNdjdM z7KSY56mf6{V1}3rw&zC)TM9mVJZe}|B*FIN!R?WP+ary`9w{_?n2Hkc+QXjrpoTR? z25ir@5<zHaA^anYuqTG8mJP!{Y&8s7LfI@6n2Ju6u%*a>x?WjADB;EiDjFuR=T+3O zrpRYAO<*pvgWID3_m3hDdlaDlf!V`cWI(_kfg08nC9plq;PxoP?NPyDk1~cmGw|BO zmbapYHANL{&m(XOL&S|5!VYj6V1cGJXxvO-%gd=@O;OKgn!r*d2iB_rcb_H>y&4er zO<>D2s9{af0_zO`>qRdcV75Wah6${B|7uuMw81)hz&a4Ii=J9xdZDRx0&Cu(8rBpY zu-+43y$D~Tr$Crqm@irL+G<!+bhDWzuogi|F@!Jm2>6mU&#Q(tMIWr!0c<bWm*5;` zfI~0Bzo7hY2-aHz){F2js1g)F%AGJb!~DyV2P)Bw!FqRq^&<Rhg2P^ze_8UT)v%_R zg7tm@>qYq242ND=tg_@q)v%_RXERM;D++?7+AN_Irfh}@Y()y7beICFl#%llV+z7o z76{X0m};3pbp~>oGl4npPYr8|CD`;0aMQ)Xrq_W@7YF5Hq+H9Gg2<UxI82A;%n8hS zpgP1ln`r`j5g*)iDX{5xz@|%Kn2yMgHaJX&=En)lc@8zKDYjtKbKs_HWHU@)FR}ug zu7P2?9XvPL<1pP0nwyyN9@Vg>IDkz*1vlLhY&tmqr#NDm?gTg88HedkaMN3ASW{fG znI>?6hL)gZD>x-1)#cb~BGzn{2^>XYIBQ|1Jgpkm6j!jxZQz<4)Jj042&8-+!-!F4 zgX%hn4WJ<@?Dafj-iaF46gRL9FW@#HasyKCN3sE$7r?a~#D-fq{lJ))R>PX&p3O9Y zv&f+Y)P5k<51jB;125P{NNa;J50w8sz~)Yan@ftzv6`E=qlPub6Kv`maPB50v_b6~ z&Z1|i?VA#=TBf|D8rBrAY^DiZMNVK-NpUC0RIVZ$ET;05u%&p{utHlepmrTg8fZm| z52TY0UI+EE0W=!;07U%%|NsBX{~*=^5FyXNz)&Tn3R-EBoSK?a3?BZ2j+<zx7Hhuz z08%vpM1VS*RWfKw;R7ik#TW+VLS`pGaxV{n%s2#EU;FYfXwC4;BiO8lj?#d290j%J zLF1TJOm-eGkAZlgrg#;To#)HrpxzaeQxb-ipaF%P)I6{OCqP<2UEeBZJCCH7CqZ0Y zkgd#io=GoHfmlp-X)jNMTn6fnRWaG6ygUQqodpq~l_xLHLsSL6ya2M1G3g~}45*69 zF5~4Th)m|o%MeE4%PSxy%t?mDFRwyaM#V3$L0BfmFRz2l<b-f7ieKIUaY6n2m!QG= zTP#V2X2maWf&_1Yh}$3n)Z=@37sR>;BJP7M5(&-A&dV>)Q^-h7Oi3-WQZT4ct<V&{ z#TOD8;2Q7g>+9;`=@{Z#1nRyZI_kGLz|ujE;YBH+U;r)iDFXFHZ*hSo9D{-!Ba6~N zu7jxbbqpv1t*?S=bn^5oN(IS+)@PL_m)zopOk{wUt`&h6tw9yKMuZe)fO=r;;2zj5 z_SA~h<kFJVTg)Yu1>pV|cu8ClDD~Z9^g-)%-Qt1t%^-eD1ogfafktx}S-=p~+u~#7 zVdP-sVH5z<ER0;BwZd?=5O_fmXw4jG*bTB`4m32!#RyW#!wAw1QUl?OQIXHZC<Y$t zL(n{Ed~|vIe3%~~s>tWT!VJ_uh4@+o>}x`NQ22qu45C^9ymA@B=3@l)d$}0lJSHB- zDpAxCjCe>4!u!3TbPpQ;01ajo^D!|nbTBMn01fcOFxNubF^nakKCMm-QweBEsYVHN z3M05b#vBY<*$wL3dektLux2wCxs)(NR^@?K-htIK6`iPIEMd!LDypcEDq*i-Zf100 zh~=wg?O<5IQNjkQ#S4?d!OLw+I6<<tY!wP{bt1K_HEavGz-qY{f>*Z}c7-!^Fl6z7 zCVh&wbucX8sR8wE*g6=pc#96yumv-e@PVd*K+AbcSi$|zDu@dvFcz^@sKCvZKz0Mz z28e5(L0r?pki`$OV*+E5K?lPE{&t2mM$q!M77myR&5R2fYuWPLG8t;wDzsptv2wNS zVAHr4GS+gyST$@l95xIS7z^#dt`~rsT-L#`Kmg)?kjvrj>;MhA)G(C@g57_igCR=@ zs$)Y9%K~8#zk?x5WFb>6OP)*zLzd_S#-c+dVxU2tT9!O6keU=$P>-*M1so3IU~^t| zFf5R$VTPz%$OM)F^=%o8{y@aQB2u7UXfaobbQ2>;w<eok6`yNGL25E+svlgbRPn(1 zxrqhv5lT>T4jMoKP1qDe#&%<+Y8gSvsf2MMoK9m3V_;+`WCD2+wCs_o$PH9_@wi6B zJNx?uhXjQ>hiEe0V$w6X#Tbt=iU~@kzc_8uQ}a?Q3X1H)nHU(rtLRyns+19F98&t} z+2rIWC*~B}>A}_CVl6F6i?`5}DFW4Uw?tec;)7frUE;w7Y`ll7ql;@$(JojKd`k!> z@9P)<lidw+DZ6V#e6Y7?z%90lBG8g5u=|TZL!(8Y`l1L_dlrG#a~H*f3<E8RFG>Qj z5<$dH5D^P9hYh^$B(*3GBm$bcC;|_X?FVr|3oeWHfLJ>~1bE<#6I^T;fokibgCJ4R zI3}dX1~npzKuc+hKy~pg=Iqo;aPbWbK2XSkooNaRGf*YKz$gHk9AN}amT)kFAb7Hb zk&lUwkp;Z)Qv_75FoDV%(6kAtEC-czER0-C0!*M?AfQr)hY?b4fl4D#naaV)#RL%n zl}e!HqgBwA{;5TJ(8a9q^a8FuU~>VW(cT)!C^m}AK?w>h09jrP+LBU|S`;4-ig*xa z0BxZ_L_T=$P<%Yx4p5o|wI9HPdZ6Xmm13ZwWKepnWvpQUEiPtc0IiLOE-p4>1TQXz z$&|1(F+vs?!%{0NI2a*uTn&l@(9&GcPN4h(&yv)lM9^FdbSxYaA($Qj&#c6kfnox* z&4YoF2|RrQ3R4c05z2UoN_a^P@(d`Pz@7oEz=e4Q<ONXqP-IfVw17E<v4jP@#vC-9 z3z{?njoPq-#>Sf&85wFA7H}+NU<8-AnoNFG)(PN!E|4+T1lY<vl-1>W3ZS)83JH28 zsW~|spv9%IrR1ED&;T{l5c9dWgfLf=Lz+9_abocF2q@^F!E}oo$pMh428S6a&E8@u z&dw}o1O*i+e=&dqiic5*5ovx2qyip9ph^sD5Y;k)*HLhi5=1qi-FH+9B5<JqUw2;w zYN28c6X+BLsNsq&{S<-Xz5^5<pdDR^@Zeyq;)mw~NC`Oj!vx&wr#wt<34&*kz*Q5p zaWesH2uZ<12t&i*4=hlh2$9FgPC&Q#!F~sI{~+za8CZi#0yU@*%Hbs|O6d*CtDwnH z=$s&U0v1;HfHO0g0I9mg0xConfGh<SXAH<W86*R05r8(N`hge{MY5nGRt`jfy2H2F z<Kt8EljGxyG(ke3dH*8NM063TH~~+o7J=qBi|RnKpe_`os|C(`pgJE?T7mkFMWDXo zEf!D#TLkJGg7Z}osBc&V>J}D(dW1-25#0IU?E#ITwFVXp3=AB8ph^?8f`Ew;26<dL z_&8WOn8A>pLxHEBA(Y3CgPDVqg^7!uivt9~rhuw=(0T<h22DPJO7!AB^gR`d;GNTq zQ7oyfscfn2Y0N3?DI6_~Q5-3pDO}*a65J^~EeugykR8ua+$sDi0-(JTDS|0NEeuh- zDZ(itEeuh7DWWN2EeuiosjO*?DdH&-EsRkD;Qh&<UC@yI$wJWm$->b6$s*uA5lXk% zKzs30ixM+f85qDz=6q9&ixbmRLBa|kBDDyz+`kkginRI=ybA@i_7I{-1F@nm5we*` z4_x+ZK-B4hD2+r-VpJt*Lf0QcOja)j?aV1IDJo4a$uCmKNGw(;&d*I%$WE;+&o4@W zuj5ABvjJOa1Y10hSSIM4pI4SzR07(xP^19b(Fa;L58B*Wl9>nPXC#(DJ+Dw)T2PQ* zR07@N16uosWhJ<Ju|i6IGI;9<>WXF1(jt&W@u01FIjQk!Ir)i5yCgtcyC5<Op#5H% zpe@P@U^NhjfEFf#xyVaXp^G}fu?1Z=54I+;v?L!i^ND1BP%3EIFJ%1$ba8lUVseH8 zC^o=Ly^2yxN{jLoK+Bdv+n-YNN)!@{6%xRcwkUf-K+80dHYkAhvcMJ;m*gvecOB?} zJPOqdYD$#kE2O8EfFiF1Y;InP0%&(kacT)vHaQ2hHv!^09Ki+}nF2)-BKAN*mIRBa z%)FAK{FKsU$ZkZ~!hO&V0R<yH1MmuPuvZW(qCHC#z^nLE^FVtAiWQ1WiYyRe4PEMl z#W9fO;NT6Q#R$j1f*~Ke*#+d(Vx(;usma-pZ5c_a3aJ%|$t8LUE~!PCpxu+;?PRIN z;8+BuD)7Q<`08Jf<G{{>ng(9$nu@$j2x&(q+zimRCU92{w3!f^a6$H07Nmk>J1xHm zw4DPaln=`nh@f#yNy!AYaluRdz`Jd5TVAXHS}KN=DMCP7N+G*N(@Jw7E7MDgDnW~y zOY#xt87L$sCzlo_mLR+WZdSv607~!$kTVd#VTl?Op!NT-b!mu5Kw0?@&)kr00^qC- z+D#5w^bg+n3NryYPpOxdr0H6yLkk{gt^!#HO%WK|4Zw@86fzR?Qb21sLC%I5s{qx4 zVmu`Is6&cBKev!%P|pQaJ%DI<s}{Vrj0wCZm@kE~mMM=1ymFWcy0MfQETfjfT+0kz zjmuoaQo|6>0$!8L3Yr*>X9KPBjb{f9*2i;{a5jUE3gCjaj<ZU*YZ#jui?d32kk%IS zf_p!#enp^RTT++D7Wsh2MkQd|lfb)*kXFQM@*%Zqz$-y{LCY3F=RklX_ZAm;MJ2d^ zyTug`FTZZ_g2iEZzX;T&hIFMtyWJse>i|$Y05lwNiz6Otza|H`7k!Hz$}cJasVM~Y z#|1#^ARz@UqzJyniLi|aBnh+Z77rw<AUPeWod9a#fH&ly1vPL$T|)+D4n{U6#DYXn zV*!Riy>1Y$;)hgXh((2<_68{8L5+M+(*V@!FYaSyU`SyEtvbnKC=#h*sbww!jX!ae zFqSZ-G1an7V6DiiVFJxp78#T<!?t~clY<Lr+0g>l6qbdI!3;IbpmC;VrlPDG#-cc= z3@ccMA&X@JYYH2f4N}G43|e8)lEPHO$il$Pkj+@smBOCQP_!tIg^?jo1fsWuV*zIh zM-AgbCXl`qPPp1_V7HvZP|F2Z%MMrjD1|$lvFHz2tr(KIJSn_2j0>5;CiB5mPhcz( z0hv94u}BX?2Y-qHTn9H)2g3x$BDWO5Y{m(UMF|)>gi?gzIz*s4Kq@Oz__9GdCt>Ii zO%a3Z5QORgsa%yJ4z}Y6h7O4oNw^Lvs1A@FcTz;ac6`IoA)O)v*C7to!7zcTh%ZGp zn{fhDkp_kixfFT04h5(VkV=OX&^$0xQ51#_#S|r&jvCepOvN=d3|U;Dk%S3MMW9)G zP)sq_GNvfkvKA_oaHpt1#(irTOL$6n)0n`i<6H?JsK}^guVGJ7&1RjzRJ5anIYq66 zA0(P30G<6}SRh!#4jS!+#4Tui8JZG>nn9~kKx+|%L1}dYQ_;H;krZ{XO^gdfYZ$VG zYZ$V`7BbZ`qS?e;BvHbgq5)RPus|G#`4V9B3m|%H7_%fr7~pPYE{ZB)PSJ##fXjta zU=udfFl0$jU@n>k@c}s1Yo%zz!w;Nyz@j=Sx^PiYE|O^mtuc94!<Z#o%TdFaC0EN? zB45K%q5v|t_(q9h6Jv>d4QB}tnEwLI=d0mtW~}9^;Y!g1uloRP+yLcGeNY(Y?W*BQ zF#wAzKwOhz2o_&d!<AwL76+|H0I4?yi+9y<rI>)l1EA_n!Qw?VTq$N?@eHWAIaoZZ zh6|J*C$JQCLBzrSvPiM4;R5AFMut3#8ZK~tVkugKq(Ugg3a$b<7fYmA!^DwPbJcKw z$_&t$6sX*(;RM+Ys%k(bR1I4*Xw8ZNB;IP-YZw+NL1MT<twb5LLBxe2R;re}hGBt9 z4Py<rBts2Tik<`mXyj`GYat(G6dz<#i7MEnuo{L1Y7o;()In(zsvb0p!8(DpxB{N` zS&J%a7#6_Nz8*O3i=^1pFs3m=QgfjK#B@ztKer-KN4QF&C^fkhe0Y#T4rqfPXct6k zYD#L#XOQ#(FnJhE9x7@DRW^)HnGgQ|{|}yQE9wA=FgZCD&1PU=$ZYuk|9=&;ol{cL zd=U5le+C8+*Q00-h|ACbk<BPt$iTpm0~+x9U;n?J8LY;$Xf9X{149EyOJ>m`kQz{J z0#XCQ{9tu~Me{%szyE^_2URo-3>;vI!lK2X8Q>}@&%Bb<^wc7SGSCSv3i+iapmo;Z z;cl>%AU!M$Rs5>Opgl4r`S}VtiACwDRi@5~dFmyQt;?yfMh>X`oSBzyrI42okpVUM zGK-;mi!)PGs)Qkj?x30_?h8Nf2UUXE&MB>E2B=lRZ0D3xG!s;VgU%EIhwl~e{u(gz zY7uBs8qB;_G>d_O0nEH!v<}9+0SY9iqA4H)rh$m*AVY<nAt#f-+t~`LMVcB#plRP* zET9%`5qL-+ba)V?nE^h0CmIxooSAtg&_=;t5T6CqhbjV14i~9|%m)wfgEp{0meGQa zD*+F2+!BZfsf-6TFd)M+x7b4=jZ;X&2Hc2Y1GgR_69zCHMTzCmF)#2*DMgkbYgxgq zr6SNAHF%`t77J+ed65&y382-ux0peFBG9D5Eg^`-$b)A^pn3LNtYC>-ETC=BxA?)F zc+fBqcqa(>G%igZa8n9A0|DAEP+SrZPW!i5!RO%I5(HD=;DEO1Zt*}{U7)60$}KKX zV1ng~A=A&_K@J4F60{nj2t2C+O1zL37PxWsi-CdR8K`jun)GL2Vqs)sWP$AU08e6o zrk_C*5Io?;zY>fhj1VlwD8q;wgC;pZO*9Th0Y=coG>8u|fr*ig2_gm(2Z`~4$Dlz| zx1h;xF-9@aAux<=i~>--AbE5w!N|oZ!6e2g!pOr2nnVGa#m6WGW`ib5K=y&`ui}9< z1VO0*WlR#}d2lNbw2-}$4>a-*szbp?;)y{fElL={O?kv2K;SdMK&Q-r%G@Fcn0y{z z32TvG31bZtXt8=c6L^@L(NB}D2o$*BgP|blS_TvypfwJ+ghPWp{oLb&LxMd0+?_%_ zeOz3FV5{jt$LL@ks{RNnNthWJia|&CfMz*Bv(upVE@WjrXwImL8|q;U|H8XFph+8$ zZ%e?Zoq<}8;QE3Ia()ijXIdq!5TEDqm9Q0Al(3@vjJ@a&$Sa^_GH5=7_?C&0fdT5B zTda@-4xUUyO?$WaK(0h&f<%ztATv0iNCeHigZ(6m<R^q`l-LB7+Thp(CH5Ld@FoGC z5(e-ZZ$?PGg4U)X`OyHyk9KH&Wb#8Ql{MLmz-7}<ke@-xr3fC87~X~CJ8Yg61bY^_ zT*w0X7qZ<4G;0XjLIwA;1hSuzHPPMMu!0d(RzZqVLQ#%84EVuefH0{PPY8%1hX6uL zGAODcwIu@syesF$2-;o%ITo*2sDuf!paQ9zrIx~+%~))Z$Hd4`!VKw&moU^Ym9R8} z&H-aeVFfi=A&H=txrR9fw1X_Fge`>~BwoXu!ja8XR8Yf^#lC<e1>CI4+g8Jz!j;Wb z)CLvh1~s<w7Su4O@MJR;&4G&Yf<?P(m{a(&nTj?+Mft&^B{j?`0@<Ji9T0N`!J=_B z%qc?Ij76`YYK2QU7jUJB)G#k(5(gjRlxI`JoFWSD7V$yVh=J9JBdGx`l?1s}0xTnm zkb&p`i;93UKgdpqSPggyC#booDdkrs0~#y<)pC%nvl)qHpaV`yz{6vD;5OPz(6Xy4 z3Aj4Mp&$mjhDPR9lAxU?NV>sef?)mNyaj4JF*8*0g}~Z6;3IgzYxs&@fpQvXIb6|e z5DV1mD0%~8ff^k}Z$T_jo1^F*hy`lwfg2*ni(Y^lYoI0=n12Gam=4T330g>}$z24h ztBZbsG=b`W@Xl1o8Ub)g2F~Q*{0(k^fEpY{pfXpJ1za!R;(&P-Qt^YURJ0O}7o5OB z3-dr~8$ik11e938b(|QuE(8_W5DYmF3N)#Yz*3A{j8aUXI<`s#IRn6qglB)yWDh*~ zgBBowOFhOSQ2&Kt0V8<cnhA6Qm^cHdPXJn3l){qDSY!v9R)Wg2rhv|e1dj#OFs86) zGZw`l$#Q^39zea5V1^Qw6fRIk04EM^zoK4H5P|}`s0S9}pq8IU(H2lE7?eYyvCC}d z<XN;8)Cd%E1f3~~((cq`g_I<yp$#r;p;OtAk_0u3i$KNjTu{hDstOK92}TY^P}qtw zR!Ks`4AQ*9T5b-KfCF_}GC@fd5^&qF1>AN}zzMo!CW8+ffp-eX3^z7L28Lxg!c80{ z+>lCJP_qG)fI-bA5C&JWpouk569Q7PRv6SUxiG|P#4y#efCkeRFxIftFsCp=x{jdb zzcs7~exU%gtH<OA&g+^?MIeWPn@XB&;EV=|b!J8ehN8cq);DAJEyglPlNFp4K<)rH zK-PnN0~*T(&D--a3NTi|Dh){dgZu$*ePGWupl%8@*C-*Sd!$^$$dH!@ZV`FZFoJWB z2a-B??qOue1IdH(52)7<%YE?t!^n`QQNx(RmCabxfux^1g$FXK0X|`t6>`7=IEV51 z6?MULSSN@DD&s&2#i?i`YKGf{E!}Jer5k~u#B$W^#)dV!ftK46%yVBE7#OyKLL1gx zkz(Wn=Q~i|lVGYsO+Sb}6!w5GgYD)P0H+Q{&|oAqB0$4dObeL7r*VQK0#X1$gWm_z zhy%;QgCAV9fdW4ZNfsXX!3-sAsD&3IEGMFd<s@ujIT;+5PMLYAVaZ+u4mVJ^U=3AJ zU4pL=`^3P&a1aropmrau5aVDJLl00yHx^~N0H`PfXGqXm9!SbU9G?rW$UqHM?CS== z_1;;K3qYnYFv7b^;A$GXHK5UR=uyaw;DpNPr^y6q0)uSBZqY4P@bu^fELMRfG}-<9 z{M<s^+%!dtP**1uf!2+KNB?h$y12SIhWdoW2e~?j1_isu`*`|#hCu3b&>67c;sab+ z7qNiK4OS4r4kCC#1gOe@6f@v{3pmz5F#ryPA_0&RaLIxoz-7!W1_p*DpuRC^;(<eh z1>7y<5@%xM%jMwZ;N;-u;O3C!;N;-sVdLQ8;Nf5{0_o5+hd4YKlySk02=J1e5D*vC z7=ScDK${J2F&CE<6@kvCzQqb23IdN5fX4!EvE=0ErGrij1s}Y1i#;Q;II*OpD2gLK z9(=TRJa~a*lpu_&2bxPyNi8Za;s#j+imF@Op1Gh|bnvWM5vWggi!C2~3@kX#ZZT!% z7lF=Ey(L$WS)d0!MqCd%pQ{Hy@TwScm;opZiok2>L1`N@`~o^GGfEhXZty5c5qKFJ zc(Dk0WfFMB4S4w_cu^>5?Pn2q^(J^-CU}{qASfyfKpp@O34x;))M14zCjp(T30~>} z4rinq0UU3jD7(dB13A^%4m3<y3|a{aT2TTzQWmrf6S}mX8MGjig^`1Wi<yU!iBW)& tk5Pz`g;7WVJeI($z`?@|QOUvtr9n&bnOK<l*g1qaI5>m^>KPzV9RM3ZrL_P6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +class UnpackException(Exception): + """Deprecated. Use Exception instead to catch all exception during unpacking.""" + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + """Deprecated. Use ValueError instead.""" + + +class ExtraData(UnpackValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +class PackException(Exception): + """Deprecated. Use Exception instead to catch all exception during packing.""" + + +class PackValueError(PackException, ValueError): + """PackValueError is raised when type of input data is supported but it's value is unsupported. + + Deprecated. Use ValueError instead. + """ + + +class PackOverflowError(PackValueError, OverflowError): + """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). + + Deprecated. Use ValueError instead. + """ diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""Fallback pure Python implementation of msgpack""" + +import sys +import struct +import warnings + +if sys.version_info[0] == 3: + PY3 = True + int_types = int + Unicode = str + xrange = range + def dict_iteritems(d): + return d.items() +else: + PY3 = False + int_types = (int, long) + Unicode = unicode + def dict_iteritems(d): + return d.iteritems() + + +if hasattr(sys, 'pypy_version_info'): + # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + class StringIO(object): + def __init__(self, s=b''): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + def getvalue(self): + return self.builder.build() +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + newlist_hint = lambda size: [] + + +from pip._vendor.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + PackValueError, + PackOverflowError, + ExtraData) + +from pip._vendor.msgpack import ExtType + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + try: + view = memoryview(obj) + except TypeError: + # try to use legacy buffer protocol if 2.7, otherwise re-raise + if not PY3: + view = memoryview(buffer(obj)) + warnings.warn("using old buffer interface to unpack %s; " + "this leads to unpacking errors if slicing is used and " + "will be removed in a future version" % type(obj), + RuntimeWarning) + else: + raise + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpack(stream, **kwargs): + warnings.warn( + "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", + PendingDeprecationWarning) + data = stream.read() + return unpackb(data, **kwargs) + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises `ExtraData` when `packed` contains extra bytes. + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise UnpackValueError("Data is not enough.") + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes (default). + Otherwise, unpack to Python str (or unicode on Python 2) by decoding + with UTF-8 encoding (recommended). + Currently, the default is true, but it will be changed to false in + near future. So you must specify it explicitly for keeping backward + compatibility. + + *encoding* option which is deprecated overrides this option. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + (deprecated) Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like, raw=False) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker(raw=False) + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + + def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, + object_hook=None, object_pairs_hook=None, list_hook=None, + encoding=None, unicode_errors=None, max_buffer_size=0, + ext_hook=ExtType, + max_str_len=2147483647, # 2**32-1 + max_bin_len=2147483647, + max_array_len=2147483647, + max_map_len=2147483647, + max_ext_len=2147483647): + + if encoding is not None: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + # Some very old pythons don't support `struct.unpack_from()` with a + # `bytearray`. So we wrap it in a `buffer()` there. + if sys.version_info < (2, 7, 6): + self._buffer_view = buffer(self._buffer) + else: + self._buffer_view = self._buffer + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + self._max_buffer_size = max_buffer_size or 2**31-1 + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16*1024) + self._raw = bool(raw) + self._encoding = encoding + self._unicode_errors = unicode_errors + self._use_list = use_list + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError('`list_hook` is not callable') + if object_hook is not None and not callable(object_hook): + raise TypeError('`object_hook` is not callable') + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError('`object_pairs_hook` is not callable') + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually " + "exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + self._buffer += view + + def _consume(self): + """ Gets rid of the used parts of the buffer. """ + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i:] + + def read_bytes(self, n): + return self._read(n) + + def _read(self, n): + # (int) -> bytearray + self._reserve(n) + i = self._buff_i + self._buff_i = i+n + return self._buffer[i:i+n] + + def _reserve(self, n): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self, execute=EX_CONSTRUCT): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xff) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + elif b == 0xc0: + obj = None + elif b == 0xc2: + obj = False + elif b == 0xc3: + obj = True + elif b == 0xc4: + typ = TYPE_BIN + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc5: + typ = TYPE_BIN + self._reserve(2) + n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc6: + typ = TYPE_BIN + self._reserve(4) + n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc7: # ext 8 + typ = TYPE_EXT + self._reserve(2) + L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) + self._buff_i += 2 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc8: # ext 16 + typ = TYPE_EXT + self._reserve(3) + L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) + self._buff_i += 3 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc9: # ext 32 + typ = TYPE_EXT + self._reserve(5) + L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) + self._buff_i += 5 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xca: + self._reserve(4) + obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcb: + self._reserve(8) + obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xcc: + self._reserve(1) + obj = self._buffer[self._buff_i] + self._buff_i += 1 + elif b == 0xcd: + self._reserve(2) + obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xce: + self._reserve(4) + obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcf: + self._reserve(8) + obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd0: + self._reserve(1) + obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] + self._buff_i += 1 + elif b == 0xd1: + self._reserve(2) + obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xd2: + self._reserve(4) + obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xd3: + self._reserve(8) + obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd4: # fixext 1 + typ = TYPE_EXT + if self._max_ext_len < 1: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) + self._reserve(2) + n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) + self._buff_i += 2 + elif b == 0xd5: # fixext 2 + typ = TYPE_EXT + if self._max_ext_len < 2: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) + self._reserve(3) + n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) + self._buff_i += 3 + elif b == 0xd6: # fixext 4 + typ = TYPE_EXT + if self._max_ext_len < 4: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) + self._reserve(5) + n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) + self._buff_i += 5 + elif b == 0xd7: # fixext 8 + typ = TYPE_EXT + if self._max_ext_len < 8: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) + self._reserve(9) + n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) + self._buff_i += 9 + elif b == 0xd8: # fixext 16 + typ = TYPE_EXT + if self._max_ext_len < 16: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) + self._reserve(17) + n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) + self._buff_i += 17 + elif b == 0xd9: + typ = TYPE_RAW + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xda: + typ = TYPE_RAW + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdb: + typ = TYPE_RAW + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdc: + typ = TYPE_ARRAY + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xdd: + typ = TYPE_ARRAY + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xde: + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + elif b == 0xdf: + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + else: + raise UnpackValueError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header(execute) + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise UnpackValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise UnpackValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), + self._unpack(EX_CONSTRUCT)) + for _ in xrange(n)) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._encoding is not None: + obj = obj.decode(self._encoding, self._unicode_errors) + elif self._raw: + obj = bytes(obj) + else: + obj = obj.decode('utf_8') + return obj + if typ == TYPE_EXT: + return self._ext_hook(n, bytes(obj)) + if typ == TYPE_BIN: + return bytes(obj) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + + next = __next__ + + def skip(self, write_bytes=None): + self._unpack(EX_SKIP) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + + def unpack(self, write_bytes=None): + ret = self._unpack(EX_CONSTRUCT) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_array_header(self, write_bytes=None): + ret = self._unpack(EX_READ_ARRAY_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_map_header(self, write_bytes=None): + ret = self._unpack(EX_READ_MAP_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + usage: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializeable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param str encoding: + (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') + + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + """ + def __init__(self, default=None, encoding=None, unicode_errors=None, + use_single_float=False, autoreset=True, use_bin_type=False, + strict_types=False): + if encoding is None: + encoding = 'utf_8' + else: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._encoding = encoding + self._unicode_errors = unicode_errors + self._buffer = StringIO() + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, check_type_strict=_check_type_strict): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise PackValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xff: + return self._buffer.write(struct.pack("BB", 0xcc, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) + if 0xff < obj <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xcd, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) + if 0xffff < obj <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xce, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) + if 0xffffffff < obj <= 0xffffffffffffffff: + return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise PackOverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise PackValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, Unicode): + if self._encoding is None: + raise TypeError( + "Can't encode unicode string: " + "no encoding is specified") + obj = obj.encode(self._encoding, self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise PackValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = len(obj) * obj.itemsize + if n >= 2**32: + raise PackValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xca, obj)) + return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) + if check(obj, ExtType): + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(struct.pack(">BB", 0xc7, L)) + elif L <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xc8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xc9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), dict_iteritems(obj), + nest_limit - 1) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + raise TypeError("Cannot serialize %r" % (obj, )) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_array_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_map_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xffffffff: + raise PackValueError("Too large data") + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(b'\xc7' + struct.pack('B', L)) + elif L <= 0xffff: + self._buffer.write(b'\xc8' + struct.pack('>H', L)) + else: + self._buffer.write(b'\xc9' + struct.pack('>I', L)) + self._buffer.write(struct.pack('B', typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x90 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xdc, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdd, n)) + raise PackValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x80 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xde, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdf, n)) + raise PackValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1f: + self._buffer.write(struct.pack('B', 0xa0 + n)) + elif self._use_bin_type and n <= 0xff: + self._buffer.write(struct.pack('>BB', 0xd9, n)) + elif n <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xda, n)) + elif n <= 0xffffffff: + self._buffer.write(struct.pack(">BI", 0xdb, n)) + else: + raise PackValueError('Raw is too large') + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xff: + return self._buffer.write(struct.pack('>BB', 0xc4, n)) + elif n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xc5, n)) + elif n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xc6, n)) + else: + raise PackValueError('Bin is too large') + + def bytes(self): + return self._buffer.getvalue() + + def reset(self): + self._buffer = StringIO() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "19.0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..a0cf67d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, +) + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b736e31cea5c78732f99cd6c0bc63926fe84776 GIT binary patch literal 740 zcmZ?b<>g{vU|`Vf?~HlD#K7<v#DQTB1_lNP1_p-W00stz6owSW9EM!RD8^i-D5hNI zC}u{66s8pB6qXd$6t)!h6pj?mbdD&N6s{=N6z(Xt6rL#d6y7L~6uv0V6#gi#6oDx2 z6v0$ZF@`9f6ro@SP2raydo-DE@h2t~=jW7`q{e6F7UUO|+~P>dEXyp;%+I^US5TCh zR}!CAnwMMx;&aBwmt>aYq{heJ;*O6mF3rtNEUJu;zr`LOUs{w25iLtC0_ly9zr__F zpIBOwkzW)ae~U9dJ~cNnGY6t3Co?%UuNY(uZ+v`menDkXW_m^mNLfK*a&}^RW?p)g zl5>7hszPZ=W=>{FW@@oQT7Hp2KxIirex3qEQEG9OVn#_xL9vy-etKp}Mro2>a(=FU zL1jUrK12n`7#2fIJ%cJum;AiMoD_xNlG3!a5{1OP6ot$@kT+9G6LS=j^YcoIGLuS6 z@{5YA1X93C9g4w9^)mCTl$?TH6!MD{919YYGg1|NAdc5j2!r@k!AQ@bO3WGN3k4$s zLla#i14By%)nY$QUQjTkm6ntirN+k>F)=VO6fuJc76t|eP`D-L<iy7pv4VuyKm<F8 z0L6R}Cx`_~9Yx$A77qgh!%BuC0T3HR{3_8eD9S8LEJ@WbODxh)%g;$kEh^SGGS)XX zGczl<D6upz&Wlg6Fv_(|u{1R?HZ3<WFfd3j&=1is$Sly!%quQQ%*oNUFv!i$$TrFW z34(EaS!!NNei0%F_2c6clk!VT;^XxSDsOSv<mRW8=A_zzJW#B_z`!8F%*2Qc*_c@v NSr}QESeU>hBLL5p*jNAn literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..015edce160dffc45ae966cee9bb943a61861a2cd GIT binary patch literal 578 zcmZ?b<>g{vU|`Vf?~E~GVqka-;=nKm0|SEt0|P^G2m=E{3PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6l*S96k9HP6nid56h|&+6lX416jv^H6n8F96b~aq3QG!W3R?<$ z3P%cO3RenuI!6?53QsVDChtp-U7F0d_!E<g^K(i|QsXmo3-XIfZgHe!mSq-a=I7nw zD=5m$D~V4l%}XxH%+Gtt2y!mREw1?Z#L|+C{G#~yTfFh{$@vA9MVaXtCGqjMIOF3} za}zUj;^S{|$H(VnCa2~Vr$RWzrMbC@MU@amC7C5TAaVBi_|l?Gh=Q`zB9N`|@kQJW z3=Bn}z$xMZv3NlQ8;Ae}OA#lC#m>OM;HSw4a!XoiNoi4Pe0&iTNP-zeurM$%fZURp zlwVpBA72F44AN4BFac~n*e19ox7g$36LWIn<5w~i34+W45x<J{3yLz!5=&C`%My$9 z)ADmtQj3c9jg0k;&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf| z5_58NEevwAGqR0xK!RW#UzVDel3%1>keHmEn4X!Jt{)$tnU`4-AFo$Xd5gm)H$SB` WC)Ez*m0}?V1_lu(4IU;&WC#Ee4VP8` literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76c33e9bd0a839e931fda3996bb4614be7a53d46 GIT binary patch literal 1018 zcmZ?b<>g{vU|`Vf?~F-gW?*;>;=nKy0|SEt0|P^G7y|=C3PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDiY1jLi#3Hok|BjTn<<J7&SS}DiegV?FLFucNMnrR%wtRC0?{d~DQqna zQQRp^!3>)0FG03xGT-7)Oe)ULDJ@Bj&&(~zFDkjkk&;=KS)7@lcZ;u}C^N4lKCLt_ zxg;|`&+jG3VK12(7#NZnLAn_j7(g601_lOpkaN`-7#Q3c+8Npz)0k2iQ<z#fQkXgz zo0)5wN*ER})-a_or?6x)EMy60&}6OB=TcBmP;f3vO)N=ONK{BlEKXHO&PgmTRw&Ob z$xujC$W1Lt1PkbaRVG7i1XCbuL5yN41_p*yhA74qhA1Xvi=&uRn1dNKS*jF4ro|)7 zvdPI$PRuE`(}N2ovw%!uU|;~zAS?{>3l9SWLkD9GV+TVGb2G>&M!%H|nk=`NlXHr1 zvE(J@rrzQz$;d2@2RXd>7GsJg(=ApAn+0Ta5hz4{73migWtJtDr0SO?7U`$u=cJ?- z73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W?6_+ID<mg%$ z<Ys4N8|8om!8pDwH7_N<NWUO4IXf{uGcR2~J~=<PAhATRpz;=be0*MNd3?MK$Qz&- zV_>Y(Bp3>MP+fkSEVnq~<3S#bkH5tgAD^3_Qks(*AAgG{KEALtF$W@3#LvLM0QRFM zQxPbvig;lHMSKhl47WHzfdGy^X_z}W7>htbdyBs$6_nBviz?&63ZTZ^VkxOCNCg|L z$qX?LY%oX<R0)zzU`zN=y(I#&2^512>|!iMVxa8B1M)&zX-R2OYJ7YVC^U*dX{QLJ z>K1cxW$`VZveY6_YLCy%OUu8-91v*)B8+b_7nc;>;wdgE%FIiT2f3{H78f{v!6IPO j!LC9gz;5EOfrOYH$ckc+kO&h8Gan-#3kxF$6B{!CX`cYz literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f583d9254dfcbd0953c42ff62b7e3ebb9f5a94d GIT binary patch literal 2870 zcmZ?b<>g{vU|`Vf?~LhSWng#=;=nKq0|SEt0|P^`3j+f~3PTEG4nr<u6k{$^6jLs9 z6f+}(J3|Un3UdoX3Uew;GjkMcDr+-C6stQ!3QG!W3quMkSd=Z5t(hT;Erl(ZL6iL@ z$ZSpKTl|Sh#rZj<C8_b5xdr(}CAT<IGRrcHGxPIq@f8$h=9R>!mF6XvWaj53gLJ?! z6U;>+3=9mZ3{i|J3{gxej44bl3{lJ}%qc7_3{fm8tSM|Q3{k8p>?s^AAe%W;xLO#Z z*i*Pucv={uI8u01_*xjEI8*pj1X>uPxKadDgjyJ)xKo6K88k(1ad_sXW#(m;R3<Y* ztp(8_><kJEP@tqR1~X_f`4zD;FfgoS&}6*DQk<HTR>a1@zyKzGmFX80WtJtDr0SO? z7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W? z6_+ID<mg%$<Ys4N8|8om!8pDwH7_N<NWUO4IXf{uGcR2~zPO~QG`Xa-D79Fxpz;<+ ze0))AK~a1>2gs?Q&|+Y$5`=k34<?J^GiC+`2C&a~7#J8z7)lsx7@8TIK|W;k(`35E zl95=Paf=0HtR`a-JIsq<e-?qP0a*%C6Cclw!%~QBGT1o`3=AL|TX4F8&D3N9TXKsv zza%5I2rL94z;?04$LEy9$MYfC#E;}XkQ{0D6!Bv55y+O*_;^8Fwxq_#qu7ELgf)yc z3|WlLOu-DA;2`A6ECxquUUKR!&iMG`oW$bd_;{#CaXBEhFg{)chXX)z*c|{0m=Xq< z19%vqPAC!p`4Z$G0=DL*#>b1}uoWbSVk@>t3;{<L0b9~b;^U=o*aDKHk}aw6@v^vV z0YxFm{h%xkqCps(3qbk11R8FPw*>rB(-TWF%Ti&93`ZVdkB`qwO^=UPK(bE&rbiDd z>8Hs9$}D+_xvBB-x47ctbMsS5b3kmK`1r!o#2koB5hp0JK)JC96rDx<Ag&OI5C##T zL{TIPVu2zG9Nb6*D3^fCB~VT+2I=Bp<X}dHV0n6%t3_fA3=Aj*4@!_ji_|JkU0A4r zJ%v5E!6Br96x5RF(L_#BR|KjFi$H}K4qHJ{qD{b7BFj30*#sQ*dPtUuWAP$U#T{X* zKncu{kX4`z11h;e83sh-FY|~haEd_5(}aM<v?=R~Kv~J0fYn45cqp|Nw!*v!lwqw1 zSVdH+N7yP*v0zKcDo{*<@*XHAK{N<s7JcAC0!Kyw6+GaEAt)g*Fjh%mNt@u}&`*=6 zNCH$;NrDJakq^$gMWCDnPT^z}ZlH2R9ppz)>cLXDf#m%(*+J!NS}CYy6dzv%a%T}J x#TJ2z_gifFNm;4MC15Xt%O!AGgG7Kz(OVogkn-6Mq^B4pB*H8p%f>7q3jlH|{(1la literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7faf26a690e2857f52e2618c7af4cc7acb96f01f GIT binary patch literal 8873 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 Y>OdAo802E%5M*QK;O3C#;NTDk0KqTK!T<mO literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dd11e8168fd7f9f74d36435bccfc8092d6833cd GIT binary patch literal 3991 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 YJ|;d!7Dg^67Df(`ZYB{X9%e3P0JYHrq5uE@ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cff59c375f7e75e415da2483f15f318ae6bea41e GIT binary patch literal 19768 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 FLIBUI-o*d_ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5ffe2ef6d4e941dbaf28a21f78c15704f9be6f2 GIT binary patch literal 1456 zcmZ?b<>g{vU|`Vf?~M7t%E0g##DQUE1_lNP1_p*=F9rsN6owSW9EM!RD8^i-D5hNI zC}u{G7*h^Q6iW(o3QG=aE?X2^E_)O^BSR|70*(~cg^W?0DQqe1EeugyDI6)BEeuiI zDNMl(np`hIHfS>6;!jK}&d(_=NsZ6UEyyn_xy6x^S(aIxnV)xyub?P1uOvRLG%vX% zGe6JoB_qg{Ot<(v^U4x)GE>4*i@@sGp^PfFXx(_dSnXtxI*{=onuURZ!5QQM0R{$! z5{3ngDU3A?3z-%$Eo2C0&}8!a#i*;vd`mb!IWaFkFEcqYC$lOwz9=<4wc-|YacR;m z)|~wE)FMsBTP%5rxv47|ig+0q7=9J#7ZhcdC6=V>mn9bIr{(9Qq!tzH8yV{xo0*xF zTa;Lu7w5&NSQzD6rdXPq7@L+G7#J9&7wCuR7i1RbX66-_B<AGkS{USJXJi}YfCRxf zzAQB_CBI0&ATc>RF+DRcUB9#>GpAUupz@X=iUUDz;RE@K3FJ?vB7O!22DrCDVxSlW zd;1Lo14AWG2}2D-Gh;17I76NY3quKGHdm1XBLfK5Fa$G1Fr+ioGS)C;F{LnOGZ#74 zFfL$DVOqcf5?RQ&kdcuABvQh<fDIJODXa_FA#qy6kj3G`(9F1yaUnBU6+;$h3P(0) zQ6ETs3d;ia6i!gw*Dz#pLe+uHV#wkGt6BwC#Ray93u+HT7B^V#7+8)QEXNI(;{nS( z0?YA$<#-@+AiHW97cvGjX!2GyaVaP$D1>BW7As^HE0m=cRVox`=4R$37AchED?k&A zUVMCUNl|>fjzUsti9$wVu|j@cszPyTQb|s#LP};@T53^hUUF(N*sSu*k_?5Cj8uj4 z#7c!skn+5goYZ2lP*G}5YGQG!LUC$(ZfahM9#}&WDCt$PR2$SPR<Ucu=ox5gtK4F^ z#i)l8NubPC42nfD1_p*2hFHE@#uA1a#%9Ja21bTLrW8;LW%Sczyv1BxQl!ari%HMm z7GniC1wsf=68Obwlb)KFT2WABrw%d;6#Fa;Rq80|r3{i)^lWnSlM{1_?eyS!{K#@q zkq|g576~&jFcgV^2vD{_II2jLfq_9A$vGT)1^LA#)dsay?0PAwWgrHNcC|sRCT|ft zNIM$?1H&!W)Pnrvj9YAp1qG>jDYw|t@{4j4OKve0r51tG^DUOF{LH*t?9dRu#avL7 zdW!{Q?k(n&)G|<3O-{_wWV*!;_3ka!g2bYdVu-WA4g>|*EfH)%1M*3+5-2yZF){Km z@-eY7u`qKn3bCj$b1}+*STM{~1X8BSbBilJKCQH*v?w(`z6ccRMWFaB0u?w#k{~}R zfC!Msz+Sw?o}8askeQQO#0e4y<yf#mNUlRTk;5i8KczG$)edA@G05{GOdL!C%v{VI FtN<xMXd?gs literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af38e7d2153c9a38bdd772def1b6a5c28aead63e GIT binary patch literal 11960 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..25da473 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py @@ -0,0 +1,31 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = (str,) +else: + string_types = (basestring,) + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..68dcca6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + + +Infinity = Infinity() + + +class NegativeInfinity(object): + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + + +NegativeInfinity = NegativeInfinity() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..5482476 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,296 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pip._vendor.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + def serialize(self): + return str(self) + + +class Value(Node): + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") + | L("platform_python_implementation") + | L("implementation_name") + | L("python_full_version") + | L("platform_release") + | L("platform_version") + | L("platform_machine") + | L("platform_system") + | L("python_version") + | L("sys_platform") + | L("os_name") + | L("os.name") + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # PEP-345 + | L("extra") # undocumented setuptools legacy +) +ALIASES = { + "os.name": "os_name", + "sys.platform": "sys_platform", + "platform.version": "platform_version", + "platform.machine": "platform_machine", + "platform.python_implementation": "platform_python_implementation", + "python_implementation": "platform_python_implementation", +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, "implementation"): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = "0" + implementation_name = "" + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc : e.loc + 8] + ) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..dbc5f11 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,138 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pip._vendor.pyparsing import Literal as L # noqa +from pip._vendor.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r"[^ ]+")("url") +URL = AT + URI + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine( + VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False +)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start : t._original_end]) +) +MARKER_SEPARATOR = SEMICOLON +MARKER = MARKER_SEPARATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd +# pyparsing isn't thread safe during initialization, so we do it eagerly, see +# issue #104 +REQUIREMENT.parseString("x[]") + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + 'Parse error at "{0!r}": {1}'.format( + requirement_string[e.loc : e.loc + 8], e.msg + ) + ) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if parsed_url.scheme == "file": + if urlparse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): + raise InvalidRequirement("Invalid URL: {0}".format(req.url)) + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + if self.marker: + parts.append(" ") + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..743576a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,749 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = (match.group("operator").strip(), match.group("version").strip()) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[: len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..8841878 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,57 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + +from .version import InvalidVersion, Version + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() + + +def canonicalize_version(version): + """ + This is very similar to Version.__str__, but has one subtle differences + with the way it handles the release segment. + """ + + try: + version = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + + parts = [] + + # Epoch + if version.epoch != 0: + parts.append("{0}!".format(version.epoch)) + + # Release segment + # NB: This strips trailing '.0's to normalize + parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) + + # Pre-release + if version.pre is not None: + parts.append("".join(str(x) for x in version.pre)) + + # Post-release + if version.post is not None: + parts.append(".post{0}".format(version.post)) + + # Development release + if version.dev is not None: + parts.append(".dev{0}".format(version.dev)) + + # Local version segment + if version.local is not None: + parts.append("+{0}".format(version.local)) + + return "".join(parts) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..95157a1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,420 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] + + +_Version = collections.namedtuple( + "_Version", ["epoch", "release", "dev", "pre", "post", "local"] +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def epoch(self): + return -1 + + @property + def release(self): + return None + + @property + def pre(self): + return None + + @property + def post(self): + return None + + @property + def dev(self): + return None + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + @property + def is_devrelease(self): + return False + + +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) + +_legacy_version_replacement_map = { + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), + post=_parse_letter_version( + match.group("post_l"), match.group("post_n1") or match.group("post_n2") + ), + dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + # Pre-release + if self.pre is not None: + parts.append("".join(str(x) for x in self.pre)) + + # Post-release + if self.post is not None: + parts.append(".post{0}".format(self.post)) + + # Development release + if self.dev is not None: + parts.append(".dev{0}".format(self.dev)) + + # Local version segment + if self.local is not None: + parts.append("+{0}".format(self.local)) + + return "".join(parts) + + @property + def epoch(self): + return self._version.epoch + + @property + def release(self): + return self._version.release + + @property + def pre(self): + return self._version.pre + + @property + def post(self): + return self._version.post[1] if self._version.post else None + + @property + def dev(self): + return self._version.dev[1] if self._version.dev else None + + @property + def local(self): + if self._version.local: + return ".".join(str(x) for x in self._version.local) + else: + return None + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + return "".join(parts) + + @property + def is_prerelease(self): + return self.dev is not None or self.pre is not None + + @property + def is_postrelease(self): + return self.post is not None + + @property + def is_devrelease(self): + return self.dev is not None + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_separators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_separators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) + + return epoch, release, pre, post, dev, local diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..9c1a098 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.5.0' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479865969b59ec57f17d9ef62693a6a773330a3e GIT binary patch literal 291 zcmZ?b<>g{vU|`Vf?~DmyU|@I*;=nK?0|SEt0|P@b4+8^33PTh_3S$&w3R5tHCUccp zcu`_OL26O4LP@?tQfX#Rib6nTNk)F2LP273c4B&Ju|jEaW?s5NfNOw)siC<-Mt**F zF;^9<fu5<JfuAPRE%x~Ml>FrQ_*>lZ@nxw+#hLke@$oAeikKM~AjGc%{eq&*vc!^9 z{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV%M?pf6JyhI0|Ntt^aA}5{esK_ z-ORk=lEj=GT?>QU?2K%q9FQOw$Cst%rQ{ds7o--L8k+0J$7kkcmc+;F6;$5hu*uC& QDa}c>V*+^_M6fUc0FN0_)&Kwi literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cfb3abe7533d05e23d770da3d21f575fe478b0b GIT binary patch literal 5634 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5f661ce393c54058c002fbf656647973416316b GIT binary patch literal 2769 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 aLLA&&!W@h&j7*FiOe|Pv4i*k>4n_dwhSP`u literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed94f5faf9cbe0f245a7d9029e86dcc493c95f7f GIT binary patch literal 4817 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1de12584e57bc7c94feafe49cdaf951b0e8eae22 GIT binary patch literal 2923 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 UIT$&Zm>78&`53vFIe3KJ0k>HJCIA2c literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..206259e5b05f53700fd6eeeeff9a1b299f72b0cd GIT binary patch literal 1027 zcmZ?b<>g{vU|`Vf?~EyDVqka-;=nKy0|SEt0|P^`2Ll5`3PTh_3S$aW4r3G}m}ZJ% zN@dDoPGOW}NMX)qEiy@ANnveah+;`$OJQ$eh+@qXNa28ra6&{<n1UHJxvFeD67y1W zQWc6)6H_wt(iIZ(QWVOIGD|>guV8;ah0HvK&=5CW3mt|0JcWSDl8pR31!J%>BfXa( z*ZI9<W?*1Q200MKWno}o;ACK6@CG?nkAZ=qgrNrP$Q0&Y=6<nS<`Tv%rW%GC<}{`n zraneShH!=yhCqfOh6sifhF}Iw7Qb7J<yEYuC26`AnvAzNQuC7YK`zr|zQvMXkeYXk zC960;?-ol+X>Nfg%Pr>oq^w&k1&JjYx7f1F6N}P|Z!xB=WGLccU|{%_r(aN%S(aFm zs$Z5^q@R|blag9gtZ!tjZ)|2}R&G&ZX<nQcpJHK@YnftcYGQ0!ZeU<wkY1o4qF<0% zpqrUjT#}fRqibQ1o1Kwulmik3<M^`Fyp;SR{esj2Q$ut8<ow)%#1g%N%3EBZkV}mR zIglOXeNb31FbXgh@qt2!5fnTO3=E)<0)>z>NQnw0guu}W4k4ae#uCN_Of`%P8H3To zr3fA_MIfU!nTuE%7#ND!7#J9CvE<|@rf4!1flMyq1_^_L02~fQydVXfpeP2r4J2C( zG63v0L6F-(ZUQ+EBnmPC9D7C(w=t$LHZ%3hA;(+_Qwnn?V-3@E95KjLo&<Iw%)Lks zEdqs%CQA_q$cZ4Uia?1Tn~TAr267$Ltvrm$Sc6aj;!FmxGjRnUliw|-q9o)HD-r<Z zHQWJK1hQHb6i1*yVPNE8)MUHG9v`2QpBx_#33KM+%Hmr*WvNBQnfZC~nR#jXU^jzx mLP8!b4mfOb^HWN5Qtdz<DF&qq7Df(64kkV(4i+vp4i*3)(9sS6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa27f3dd0a6be34e6a18f1e4e3fe86aadaea64a2 GIT binary patch literal 4211 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f82d8de695b2f737070d82c027ff0cc198cb2d69 GIT binary patch literal 5492 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..d6524b6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,207 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +from glob import glob +from importlib import import_module +import os +from os.path import join as pjoin +import re +import shutil +import sys + +# This is run as a script, not a module, so it can't do a relative import +import compat + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + return _get_wheel_metadata_from_wheel(backend, metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + backend, metadata_directory, config_settings): + """Build a wheel and extract the metadata from it. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + whl_basename = backend.build_wheel(metadata_directory, config_settings) + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_sdist', + 'build_sdist', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = compat.read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable: + json_out['no_backend'] = True + except GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py new file mode 100644 index 0000000..ac6c949 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py @@ -0,0 +1,108 @@ +"""Build a project using PEP 517 hooks. +""" +import argparse +import logging +import os +import contextlib +from pip._vendor import pytoml +import shutil +import errno +import tempfile + +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +def _do_build(hooks, env, dist, dest): + get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) + get_requires = getattr(hooks, get_requires_name) + reqs = get_requires({}) + log.info('Got build requires: %s', reqs) + + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + + with tempdir() as td: + log.info('Trying to build %s in %s', dist, td) + build_name = 'build_{dist}'.format(**locals()) + build = getattr(hooks, build_name) + filename = build(td, {}) + source = os.path.join(td, filename) + shutil.move(source, os.path.join(dest, os.path.basename(filename))) + + +def mkdir_p(*args, **kwargs): + """Like `mkdir`, but does not raise an exception if the + directory already exists. + """ + try: + return os.mkdir(*args, **kwargs) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + + +def build(source_dir, dist, dest=None): + pyproject = os.path.join(source_dir, 'pyproject.toml') + dest = os.path.join(source_dir, dest or 'dist') + mkdir_p(dest) + + with open(pyproject) as f: + pyproject_data = pytoml.load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + _do_build(hooks, env, dist, dest) + + +parser = argparse.ArgumentParser() +parser.add_argument( + 'source_dir', + help="A directory containing pyproject.toml", +) +parser.add_argument( + '--binary', '-b', + action='store_true', + default=False, +) +parser.add_argument( + '--source', '-s', + action='store_true', + default=False, +) +parser.add_argument( + '--out-dir', '-o', + help="Destination in which to save the builds relative to source dir", +) + + +def main(args): + # determine which dists to build + dists = list(filter(None, ( + 'sdist' if args.source or not args.binary else None, + 'wheel' if args.binary or not args.source else None, + ))) + + for dist in dists: + build(args.source_dir, dist, args.out_dir) + + +if __name__ == '__main__': + main(parser.parse_args()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..f4cdc6b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py @@ -0,0 +1,202 @@ +"""Check a project and backend by attempting to build using PEP 517 hooks. +""" +import argparse +import logging +import os +from os.path import isfile, join as pjoin +from pip._vendor.pytoml import TomlError, load as toml_load +import shutil +from subprocess import CalledProcessError +import sys +import tarfile +from tempfile import mkdtemp +import zipfile + +from .colorlog import enable_colourful_output +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def check_build_sdist(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_sdist({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build sdist in %s', td) + try: + try: + filename = hooks.build_sdist(td, {}) + log.info('build_sdist returned %r', filename) + except Exception: + log.info('Failure in build_sdist', exc_info=True) + return False + + if not filename.endswith('.tar.gz'): + log.error( + "Filename %s doesn't have .tar.gz extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if tarfile.is_tarfile(path): + log.info("Output file is a tar file") + else: + log.error("Output file is not a tar file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check_build_wheel(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_wheel({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build wheel in %s', td) + try: + try: + filename = hooks.build_wheel(td, {}) + log.info('build_wheel returned %r', filename) + except Exception: + log.info('Failure in build_wheel', exc_info=True) + return False + + if not filename.endswith('.whl'): + log.error("Filename %s doesn't have .whl extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if zipfile.is_zipfile(path): + log.info("Output file is a zip file") + else: + log.error("Output file is not a zip file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check(source_dir): + pyproject = pjoin(source_dir, 'pyproject.toml') + if isfile(pyproject): + log.info('Found pyproject.toml') + else: + log.error('Missing pyproject.toml') + return False + + try: + with open(pyproject) as f: + pyproject_data = toml_load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + log.info('Loaded pyproject.toml') + except (TomlError, KeyError): + log.error("Invalid pyproject.toml", exc_info=True) + return False + + hooks = Pep517HookCaller(source_dir, backend) + + sdist_ok = check_build_sdist(hooks, requires) + wheel_ok = check_build_wheel(hooks, requires) + + if not sdist_ok: + log.warning('Sdist checks failed; scroll up to see') + if not wheel_ok: + log.warning('Wheel checks failed') + + return sdist_ok + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument( + 'source_dir', + help="A directory containing pyproject.toml") + args = ap.parse_args(argv) + + enable_colourful_output() + + ok = check(args.source_dir) + + if ok: + print(ansi('Checks passed', 'green')) + else: + print(ansi('Checks failed', 'red')) + sys.exit(1) + + +ansi_codes = { + 'reset': '\x1b[0m', + 'bold': '\x1b[1m', + 'red': '\x1b[31m', + 'green': '\x1b[32m', +} + + +def ansi(s, attr): + if os.name != 'nt' and sys.stdout.isatty(): + return ansi_codes[attr] + str(s) + ansi_codes['reset'] + else: + return str(s) + + +if __name__ == '__main__': + main() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..69c8a59 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,115 @@ +"""Nicer log formatting with colours. + +Code copied from Tornado, Apache licensed. +""" +# Copyright 2012 Facebook +# +# 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. + +import logging +import sys + +try: + import curses +except ImportError: + curses = None + + +def _stderr_supports_color(): + color = False + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +class LogFormatter(logging.Formatter): + """Log formatter with colour support + """ + DEFAULT_COLORS = { + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + logging.CRITICAL: 1, + } + + def __init__(self, color=True, datefmt=None): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + .. versionchanged:: 3.2 + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._colors = {} + if color and _stderr_supports_color(): + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = str(fg_color, "ascii") + + for levelno, code in self.DEFAULT_COLORS.items(): + self._colors[levelno] = str( + curses.tparm(fg_color, code), "ascii") + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + scr = curses.initscr() + self.termwidth = scr.getmaxyx()[1] + curses.endwin() + else: + self._normal = '' + # Default width is usually 80, but too wide is + # worse than too narrow + self.termwidth = 70 + + def formatMessage(self, record): + mlen = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if mlen + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (mlen + len(right_text))) + else: + space = ' ' + + if record.levelno in self._colors: + start_color = self._colors[record.levelno] + end_color = self._normal + else: + start_color = end_color = '' + + return record.message + space + start_color + right_text + end_color + + +def enable_colourful_output(level=logging.INFO): + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logging.root.addHandler(handler) + logging.root.setLevel(level) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" +import json +import sys + +if sys.version_info[0] >= 3: + # Python 3 + def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + def read_json(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +else: + # Python 2 + def write_json(obj, path, **kwargs): + with open(path, 'wb') as f: + json.dump(obj, f, encoding='utf-8', **kwargs) + + def read_json(path): + with open(path, 'rb') as f: + return json.load(f) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..f7ac5f4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,158 @@ +"""Build wheels/sdists by installing build deps to a temporary environment. +""" + +import os +import logging +from pip._vendor import pytoml +import shutil +from subprocess import check_call +import sys +from sysconfig import get_paths +from tempfile import mkdtemp + +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def _load_pyproject(source_dir): + with open(os.path.join(source_dir, 'pyproject.toml')) as f: + pyproject_data = pytoml.load(f) + buildsys = pyproject_data['build-system'] + return buildsys['requires'], buildsys['build-backend'] + + +class BuildEnvironment(object): + """Context manager to install build deps in a simple temporary environment + + Based on code I wrote for pip, which is MIT licensed. + """ + # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + # + # 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. + + path = None + + def __init__(self, cleanup=True): + self._cleanup = cleanup + + def __enter__(self): + self.path = mkdtemp(prefix='pep517-build-env-') + log.info('Temporary build environment: %s', self.path) + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + if install_dirs['purelib'] == install_dirs['platlib']: + lib_dirs = install_dirs['purelib'] + else: + lib_dirs = install_dirs['purelib'] + os.pathsep + \ + install_dirs['platlib'] + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + return self + + def pip_install(self, reqs): + """Install dependencies into this env by calling pip in a subprocess""" + if not reqs: + return + log.info('Calling pip to install %s', reqs) + check_call([ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) + + def __exit__(self, exc_type, exc_val, exc_tb): + needs_cleanup = ( + self._cleanup and + self.path is not None and + os.path.isdir(self.path) + ) + if needs_cleanup: + shutil.rmtree(self.path) + + if self.save_path is None: + os.environ.pop('PATH', None) + else: + os.environ['PATH'] = self.save_path + + if self.save_pythonpath is None: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = self.save_pythonpath + + +def build_wheel(source_dir, wheel_dir, config_settings=None): + """Build a wheel from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str wheel_dir: Target directory to create wheel in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_wheel(config_settings) + env.pip_install(reqs) + return hooks.build_wheel(wheel_dir, config_settings) + + +def build_sdist(source_dir, sdist_dir, config_settings=None): + """Build an sdist from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str sdist_dir: Target directory to place sdist in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_sdist(config_settings) + env.pip_install(reqs) + return hooks.build_sdist(sdist_dir, config_settings) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..b14b899 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,163 @@ +from contextlib import contextmanager +import os +from os.path import dirname, abspath, join as pjoin +import shutil +from subprocess import check_call +import sys +from tempfile import mkdtemp + +from . import compat + +_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + + +@contextmanager +def tempdir(): + td = mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess.""" + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +class Pep517HookCaller(object): + """A wrapper around a source directory to be built with a PEP 517 backend. + + source_dir : The path to the source directory, containing pyproject.toml. + backend : The build backend spec, as per PEP 517, from pyproject.toml. + """ + def __init__(self, source_dir, build_backend): + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + self._subprocess_runner = default_subprocess_runner + + # TODO: Is this over-engineered? Maybe frontends only need to + # set this when creating the wrapper, not on every call. + @contextmanager + def subprocess_runner(self, runner): + prev = self._subprocess_runner + self._subprocess_runner = runner + yield + self._subprocess_runner = prev + + def get_requires_for_build_wheel(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["wheel >= 0.25", "setuptools"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None): + """Prepare a *.dist-info folder with metadata for this project. + + Returns the name of the newly created folder. + + If the build backend defines a hook with this name, it will be called + in a subprocess. If not, the backend will be asked to build a wheel, + and the dist-info extracted from that. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + Returns the name of the newly created file. + + In general, this will call the 'build_wheel' hook in the backend. + However, if that was previously called by + 'prepare_metadata_for_build_wheel', and the same metadata_directory is + used, the previously built wheel will be copied to wheel_directory. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["setuptools >= 26"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + Returns the name of the newly created file. + + This calls the 'build_sdist' backend hook in a subprocess. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + # On Python 2, pytoml returns Unicode values (which is correct) but the + # environment passed to check_call needs to contain string values. We + # convert here by encoding using ASCII (the backend can only contain + # letters, digits and _, . and : characters, and will be used as a + # Python identifier, so non-ASCII content is wrong on Python 2 in + # any case). + if sys.version_info[0] == 2: + build_backend = self.build_backend.encode('ASCII') + else: + build_backend = self.build_backend + + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + self._subprocess_runner( + [sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, + extra_environ={'PEP517_BUILD_BACKEND': build_backend} + ) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + if data.get('no_backend'): + raise BackendUnavailable + return data['return_val'] diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000..9c4fd8e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3171 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +from pip._vendor import six +from pip._vendor.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pip._vendor import appdirs +from pip._vendor import packaging +__import__('pip._vendor.packaging.version') +__import__('pip._vendor.packaging.specifiers') +__import__('pip._vendor.packaging.requirements') +__import__('pip._vendor.packaging.markers') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + from sysconfig import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet: + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.name + ) + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment: + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.6'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent or None, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint: + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + PkgResourcesDeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution: + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c12875fbed6146f59c10f0210b572d3cdbbe16a GIT binary patch literal 96828 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∨nz(^ma+<6~j-a&Y1WLui zki-Km*C8`jMW;a0plM=F_FJGq2~g`S<rW7lL_q7S3VjokZ?S_~DIf+Hh~WaBGrPr+ z0v#f}1(`jA^3cl3q5=j6hWVhRuLWx3vr90sFmo}oFmf@ouz+YjMhQj%Mgc|^CKhH9 zMiE99W*IOWo|r);C<ueHX)$PU6qH0$7#A{TF@ch73X>#5EhtGagO>l+FxN1pFxfDa zuz;E}Da?`#3s^y`Cl-Ph<AO(@s~mjtlR?Y%K&2DB6AUh^;z0#o0=T>ZrH{;#Vub|A z#2I)1JwXA&0mlKPi4Cf3{507hEfG%8T9CA&#N5<doN4jU<uOI3pdbddS&Do?RVhmp zC&*&3Rkyey27*n$#gtckiv?8Dpa&pG-&s%qg2p=-n0P?d9wP^$y#aCrs5J-<AW#tk zYMYlZW-&E06^VhD?|||%16Y)~nW;zv(k2A0o2g+aVQXe8wkcsxVXR?jW@=&t4d-bx zRXIS?zCxk`Y(^L4YItzvgBLu2Yl}n$q~Tmp+YU6vm6u+n>k3}2nVJHvT6B=rffs@z zcXKp3ik5)_3KY?|cpyfAXE2J3K<&R<tl-J3B2W{o2-Kvy#Timr0G&Bygp8tr3tKP& zE^+-qi5?Vcpr!{X)F2H85Sa`LEl^?v(I6YaAqVP`fx@Vn5w!fNhG`*aksM={3p6AW zKv9#R0G<j}0MCtrx*`eSiCjn@0Gx&rKtWKHm|2{v;0a#j2yT*UG8KW`QxpJ70?ZKi zg0fxFO^~O-js_E8mxB~N1-TsDo?wD!1P~YGVz6sLzCySbJchtnWeasHsMJGtXl`Nw zIIf_s1&2OJO<HMA4%A1vi3Ko627(;PgycxD)4&ASeIWT)NbUo<iP+GzL2@Bt$`jh( zLUyAzB)q{+O-O(gvM>h*fgDIE6hVsKBe@dfLKp^xBq*bRixWgQJcX%+A&MC?J{rXW znPrKBj;}?rLFZW5Q@FvSYaGzgwK`C150nK#hJ$Dj21gMnWkEW~Rn{)~sgM;W(D^s@ zVw6S|XgvgI%`|v`6qL|X6mp?6l=gn$@<5XjTUxorlaW{)4^#RT?p?+zIgBYzJ!GXQ z&1GyZRu9R5ciW&YL9Dw@1Puj4GAVx7fo98LuKR)Cb;wEyy6#dWXzCf(t;FU&P-g~| zK|%8jNjZsm*$N<5a(*tT^OvxZdi3JMB7sfnOfA>e|)q$n{n2eb&MJR`Ft6+CAO zYS@B2TTqaiq5xXasF0eNoB=iivfdhE8fbn(K>;$8mXM&FkN|1~gL7GCQE>^_dWb`k zGZI0|3{s20O@#d1%#xDS6g|8F30{E$3rNU}`)_z~vQ(*HMmBPALNpKzR69>d5=Bja z3W*BvnRt5z1&y4{>{Nw>1n6pbJ@8r#&}wf@ydL0#J07fokqI{0##p6*>3CGd1RZYg zlUWR&fq>})CyZi+Oh^L{?tEm&gVIMzW)WeR3&0EoFCa<DEMh@&yAmF^Lv27QzOm&r zTi1%z<kAxG{spkZQ=sh(nEOFXe{wQYQ^1mt6bV|;n3<oKSX2oOb*7^0p!$vz6n9`H z;6ejJfD3I<BZ3{t<uaHq2hH_E8YF(2oRIbnVru&?sG_<DBJP8T2O#1hhyWQ3u?Jj3 zfC;dTpn~xWD3O8&3^^D%m^qj^*gz!8qzAkx29?K%q8PMB9kym5g|&qtiWSuRZDELF zOW{c2Y+;CEPvJ`8ZUIew^Q7>Cr@r}u88rEe>Os9hW5+yLl>#1^12tMRQ&NjTE5K5V z!TUC#<uJTVD<&9EDbT7b5z-$3Eog!7#3;#t)LpQJLf{r1bW9UeE+phamH;IvfY;3> zrJ{`{LRSbSB*3Ec7CThOEnXBekwO|2$hSm6`5dkS<R(xG;DbjrbCo*As2q4DB!(V> z{?CN_A2eD7S_uN)CZY>25Re*#32>u9PN5_aia^__i=Kc|88}&i39z??QM_GTQk0sQ zD~#l6RRW%d=pg9jT)3A(<$qo}teOVZ51^7AJT;tGQVgnS2E^N$dFc|Qc{?*NonU#Y zgWg(!`5UQu0*hos^8{Nwftx2VrLu6Bf|@6wWi_B(X0X*xdZ6YBOesMpqSjR~ZKT&# zSR7px$-uy%faF%pacw=Ah4J9pjG$}b6%<S#q$r0K@WfY8*qj^Az`&r4<Xk1pv=6fu zR)yhOobVKs)t-Tf=O6+!as&>IB9I+OMGrh9f{R;jkmaEM2x#JqgB1*!(I&n?ZDCLe zUkqAZj#A94gWKDT;2Cb%x+c&XC-BOqX2vLXXuF#O+V18|;Z5NK&u(j^@TUm0Fh+5w z2&M?NFhudB2&ag&FhudDXr_p#NVG6U@ug^`NTx`&Fh=pGXs1Z0$h0s<38cuT$h9y; z38v_z$fqc@Fh&WbD5fa2FhmKbD5t2jFhq%@sHUj3Fhq%hMwK*mi$IIrt6UrvlJj$N zAj=y;`5m-Sv@8{+6<-V*QYx;5?i17it!P##&dklsNi0$TwFWf(;3W>I&jbn+a7O_& zK9kN+!w}Dq2_hN6BokN!yoV*5qe!iUC5yF|u|lkd(S;$Fua>EXVF4RxhJcZwP$wKZ z4_9UHT$BnL+JG*D1ux71H&{WogB%SSvj=zhGE<8cG@$EPZDCH<^wVU&#SZE?W~LV3 z;sP-$<3ZbZZm}hS8Mio-6LWHsK;yIEA&;VM;6?{%p)FW3bY)EuXv5zvR<ICKssWeW z9I%~LTA)+|>T`o;s@WLX7}=OO7}=P(7^{R4YiRXgs^M7-6mXz%E^xp_frmChW9XHj zgDoKA>P+Bc8$g>1n6kNwv>;>PpwaILhDyE~#s$ofV1pbKQNohVRTKhM0~#x00(GS$ z7(nVZnX3%JQ;DD&JfJAG0JO9oRP5&_f)-_hH)n!sg5uN?$nYFU9du|Kw4n_;idGyS zugM15_6Ax<86RKt0TgE3NP`3587=S%pIZ{~kY(neNQ;N+2X$DAHJNWQC+8I3Vk$2N z8-O0Hyiko0r<sGo7Bmvhz{<wR#3%q-7S0TrtKwm*l0Xh$h<y-k@YD$!Q-r6^Ja8bV zGc+^SGL<lZ=Ka9KZHzU{pcQBfnQB=o#A;Z;sgkt@H1o&`nwKh631_HK0;O6PhFFPO zwi>n?rYyE>_9D9)rUmRZY+yBZ;S3;AkSfqDO)HZPLk(!ug{dkK9`H_}b@vL1$e|7C zgeAh3lz{?B0W@@{rx27{UIgm4DZr96B4R*Gcyd5N&kiaLbIMYS5<xuX#FP|7S_Y@w zqPL*&1@@vZAbHSOD0r~0=qrfJQj}U)e2Wz{7*-4!A$bQXDZvFIm;fd6qR*fWb?`V~ z=V0Vu<YVMw<YVRmlLCxY%9wG05$Eve0Ht}*nhtQ92bH3rWh0<Ls&od>xMmGQ7AV-k zJN7CRN?1UH{LM@*46#DsVuH1X2{e7X5VUtpEu0~RIha9{CGjpJ1A}8q3V3gJNrnPw z#~WyxJ|RI5lx;Ipi$P=Bpczw83Qx?d#4PACOW+-7g@go<Qq(o|8X$uzbreF1N>eox z5<tD^QqbPgl6(b_VpId+(Vd)MRFqm=ke>(ckwZ64!;7s-NQb*5BefFTc}@hK^P#7p zkN~y|WCz@!#GLZP%3=k`{9`J3j}EHmQb7wQGSd_?OF&Lb%mKA(D-{ZgQj1gbkTSGJ z2xz7(vsfW1H8~Nq4?H0OmbelUz&olzt-wTRUlTm}1zOOas*sys1nScz=E0qmpO>5p z_kaSjYd~c)sANGg8<9j5pqp7BeuA3^o?TEt)}yBhmke<O4NSiRC0efH)Dmb}4@uy= zKxsA>MEn3Hb!PB-$Rcn`o&pjDr(`ezPR^kGkO)f7pn{iyi;t0qQGl^Z1mQkCcnttg zv!H$*DBXh7ENB`QmS(e<KwH4FLD`(K$`X_~6f)Bkpkt?*kP!$hbt|}k1sahrD9Q(I zw$o%TdJS^wK@b7jG^fb~@dXwSfC^)1Bo)WU7l3>MavlRyl{k_g;=xnUiJ5uD@$qnP zfV=?0U~hnS<RN<lJpI6!%~_-Y%3|5<MH-;FsTxM`I6BCKOo<m585rC$^Fa9wRA#^j z(7`)}Kv@f^kO$91A@!HQd!<t0Td;8j3Mk!xOo1%zg9Z<1VP+;|qZGJS0xz*G2Br1H zVuhUiymZjuRAz}nZfa@?B+Q|+HyDK~Xis|zY!e&EEYN&ef*yDin+_=IKyzZSZQ}Uc z2z42FlnpxR3o;J0z6p9J1IRJpE(X{NWS8hDBqTs*u3(#BASDWTq&)>u$|HwaUcLf8 z_h1P#*g!Kp6M+{uf_5LKBH002V1=6Yz?C<w@dI8sh9wmiEe9>q0VO_IHWC1}cKDH! zAgEkKnVbM6JrFJiRp#vs?Tl$mpu@vjIBFPN7{Ci~m=lE=85khLq2NLgHa7vDp(%z` zmC$j21$e5146Y-}Z_hLZh!ChK1P!+9D1bNj6od8-f*XvL5OcwUYB1wKH5Nz#Jh+gP zI9MepZ6Y;Bbs*dO%0aUu`FS~&3i)}dppBd*pamA`aAT74OEMH-mL%q-z}yCEe}SEq znxdeQnTJw?DC8HVq!wu+QUXeg5!9Fg?cXg1?fb1^h&2E$!dbx3!LX1Ky7OA5mZ^g= zg&~`xSgV7vhA9iQKu4s8DU5-Up-`ld3A%$;leq{q`*Dj6T*McHhvYSxZ!zf^AQ}Uj zOhsr@JD@`J7pF~nYF=tZL6Kb#C=Gz>a~4J>Mj^&3eWVnCv7JuO2C|CZP7kgh-1dW| zHdL!n>;_p|6wJWD&;qg$6a)+$pk?d$tb?aM(DDJ07I47_S_FhN>&jfi44!pmsbO9K znRR6WiP$jIFo4bqSjY&ScV((!2DMKhyMC(dvCX@Jwta$fJ80Q#F=FbKglX5JtDqX- z8i+ufYGnmi2=LkLV(<`Y(G8GFY}0O_fy_yukV2hitrA5FFT@ZjJb8fv2^3hMQO)8I z$cY4u6<(lv!i6E$0aQoSFk~@ivlqz}@>J-7*r1L5pi>G!Yb<I&G8!q2HH<aPpa9Hb zs$rI704F<*aE3yja0YNMl(}jLB#)zJF;MV<<~34EA<KrrODsXvBevX!$nGH-sgV2) z$u*!%56Y?FECd>qD9^}D&H$Ihpmt%gI^<9tQ1JrlH<qUsK^FRhif?cW4AgQ28Gw}4 z5g8FYUGAsJ3~73R8YJMFTayJ6JuJnksd=|pKo&tZzk}NyU;>nYK^-S>rih;fiW_i; zkqxx{f{TfXNdP<*j^1GeZJ3J>aZ3ip3TRRe)SCgZ!ATjk!=i?{NUVl2ivbcBH7qHN zpfi*}3kR|}id1SC!3zr*AnWo#P3&4$(B3jo(#~Q6^Vw=xio<Fcvq0i(*=$8&pf~~@ zl99y*618Cfku|K@>_rtdtP9vdJWziJMAv}&Kz%i!^?i(4;GPm>MIT5WWQrzpqBs+z zX%1}@L5~3fH5Q6fOLP<xi;MG<Gm(xp0>w)uYP$i^9#$yL19gqSwYUzb{)aXM!GqwS zI7>*-1C=nK?Y{{Lpmr$4T15Q$=P9ICWR^f`67aIIqWsd5%)C?`q-M7QN;*i*O97b# zG9H>F;AMMpYKb~%*$kqap`Zb2gqJ54gVs5tHN-Wct7kxI4dOCTY6VvwC{{x40S|eA z%~OXgsYwJaItJwk@J<xCGeE5lWZS?8NP%X$Km)yy4Z5I=0P+Di&`a}jKobWEMXBI5 zV78!kYXTySJVD(E^<qdUfSUM~3h<E<1=z++<o$993B{#Jpvjh`RL~R@Xtp;aKLzf* z^30qZ&<O(|Ly(&unv6v!85kJ+G&yf^X66;A7L~;3=YccUEe=>L7J;)EXbU4GKY^Pn zpcelvu6S^e#pk7#YqEoLAEMT}#Rf4CZ2m14@Td<fh%^FMHxL4pA&Wp=hSi|F2wLpM zz{A2Q1RA(u<O8kZ0c}fS<YEMMb9or6_>fA@#FUg|P@M<Lkf81Whz-t=O^l#3XF$UW zpdo-1rdDRqGS^IoTDDAvTK05?T8<LNW`<f$(4yuNmW7P9ToV{8d}<gcFc#I+FfL#P zEk~>6uHmi$WkjDsqZ-ZyY&G09tP7cnqY8~`*cY(ZaA$EWWUS?>;Q=jzo4{DaR>P3R zi7s9|sfMS9JDa`ePYp}apBjc*UeFrLY>uKs5Pe0PO1NqmvbaIRAbA2MT+jg#9x%;Y z!<5Ba!(GE$!(79X!qUsa!cfao1Gd?Q0jmE`4HwAH6vl;2wR|OfHQY6P;En>v0{$8v zQ1*w|KY_7GqlT-7TauxczeE5e*37g(u!esjV-sTy&jO(u?kwSjpe3!0(6ADyVO$_m zBLFg?LZe0iT(Jn&aMcJ(GAt0S;m#5R$$)g#aMlRgFic=9^b2Q5VXa}S;kIEYGzw>^ z;Q(y|OFYNIzyO{|P0YzbX<8L4fEH&$y3iU$si5N;GRsnPDmB5q2XL<iRDFYnVTzH8 zAy~Bz5l2jXDHNv`mZs(<r-F)zgaoA3L!j~p(rkrv>C2!?`9XO<GYx#w7-$|;2i6^i zO`{=gzz6jTKqo!rC8vUpJWGS;D9|Zxu!&TRauCzUiLl+y;Q4&eNojeIV?01^0T;NS zbw0?IF|4>iDu_V7054<D$w@6r0C$$)PJlZMmen)!%JQ>eMFe<(0jPrlJueJgc!35R zK;B471r-;d%~nWb3(#T{X_GIq<E%j?KXecQvY$aAQ6V7#c?A|I@QdKCg7t)uO5ae_ zA`sMD2A@WdnU@YJ4s{g3y)n?*5VXFULTUwQ17T)9Vk{&R5jCLEB_zK>R!*jYcB6sD z(?LZrc>D)ElM61VK|<hhqT~|rM2bREDP$2bC~`oO<wc+#F0@Chr=Z{u>Z5{s9pE?s zZR9{i3#dAQ#R@2tpz#3@30S<8<SXPS!Pn@(tcThGO3EOMk-P!!=Ysp6i6w~UQf3KK zh$euy@)U!Htw5(DLKiWB%z;RNnpH`upu-0tM=63@WW}k-{bK04P>{c2!&H#7^gxHo zzy_?qhN0+E$W5$N$jQ&oRsc`lCgfIv2Ai$neun6<RZz;Uj0dxo5_A+GjY7!bH{j)| zpa2C`Qki)rsYL}vsh~~c;FUoIrA4VZi0qPI0BT$$<{&!(lsWT?OHvb4z^BQ855XzP z2bl(*ST4y2HFHvnK*tIuf{4^&L>M9kG9;~(6qO=Qu0igo7cB%e_Cbp-G#PIRL+ftj zgd3tMev1V(IdY3DJ}9-&6?Ae&@hxt|Oi%GGZfJuEwB+IzGw5Iu=7RhJ(2`g1NqzC4 z10IXuqfp?cEqG)ZTq}d;j&5-!r52aOgFD~g&6q`?+88`$Py}j@7BMn1Fx+AT2Xrx* zPR&aJSF^Wxpo1ph^#qzi;5z#j4{`w9VouE~12+ar5<$gG5jP_PLy-u`M9zYu{N&W) z;?$H|EFc%$0-eJFOOdy@ic$+9ky{Mj6bs&4326_2M!LcK4sY?MK#yc70VR-I0(q(B zAO^g+zr~Lx0%<3}Tkl2R85kH&f*K2;m75IGLQE`7EQ~BnY%E+%TufYy98641Jd7aB z#l#0%{0nZ-^RR+O%)w`<F>!z!6I_g3OdN~?%wmjO%v|7x1`l(U5K{93I;IbA^MjW9 zgVvpZn;1;+CPpo54J)X_&j>m<4&1<iR`MpW^CN0GYB*{b%^7Mr@;E@Fdg2VV9H4G( zI%o|oX9+_IYYk@>8)&U8==AQ2Nj0o446$9cToo-fj5S=6pws6nK+O@*wvBYgTAoUw z8qNhAH9R#OHOvc{Yk9*N@=RD5N;tE*iuN%w)bcShREgE_K`P@KmZCM~S$RwW44@gk z6vkS<I=%>oNQT0!2nM*#yv<A?n`_t?aFuW`;HlwV2p;$kU?|KAXDEyb2d(pEZ)U7z zuVIJyw1&NgEe$dnS<D6-jm*h`jEyChfb$!2T><VoCKTk9rf25Gr{<L*Rq3u3iMa(i zpb{xDJ=Mwz(V+wtKqzMDK#%QEu!T+BfX?L6O9P#}12MW-176&Kbb~NbJ+1*!1Udu; zlsyr{+8}kPJY`U;TLGfJSUV>(3EZ`TjnSi6lABnd0j;0G&Phy3(LrtMpc|c%SzM5l zSPAtFieUvsnRz7|>dxR}ra<*FXak!%%;TDfzybBPk;9X?<_omShn%I07|8|qd{BZK zq7XDT2AzX|mKo~B3QCYrK`h`?QpiWt@vvnFnW@Ek3SdWq)&qm199&PrYDN6*EqIu~ zM%Y0kg0NNNIhDGImK2JsK@~unLIT`IP&J&FkEq5GmgnbzN0*bqQ`;#DiKQj^xrrs9 z<A!r8VVzRYibO<dkdOdA3k>cu$T_qi8zB8Dh5S5tbq4Bal~fi$jmu3<1g#lNEKvZR z4Gfy}f*ntc)O10fa8ZCZ7Zi$<6Z1fa_JT%aP(6xB2nndIjzopxlEl1}#3In~z~IwK zQ;Xo;M$q^?c)BbJw7UvX`6YnY8Re8AcN<}`2c4TwP)N&3OjpRvOUVRnbSPFR&qxI| zfI!E#LE3=ukVz~7of=XCYG^=9PzCV0s<0Dcz$=>)p_vOh*bhD!t{8sA8{8~V0OXf| zs&J@LDM(EnaO(sb4@J<)h(rY=-ICIRoK!0X4RF^UHak+B02*2V9s3gxI%F(C6BJv> zgHC9wK{1;MUSR=ihoQuP0;DaOnWuo93*qhtw<|$oTHteyLB*ktLLzvI1hfxK0n|DL zH+N7A3Pi4hbdC_l<%8E0=D-i6hE<`-;C!Z#06xzM;xUNBK`jf&VortJ#Dap%Jj6(N zX&$Ih0l5hl2dF*+wUa=@GtkyG<ZKO4*D56yJh%WFG=d$=0V+Acc0-&FK6kGuHAPP$ zw74`e2eye1mY&hO2e88x(7Op}Eq&zv7d%M(G<l17KrIrM;{2i#q}I^{Q1c8l5&&uK z@Ff-_w=Teq2k@y$;Ilr9R6(jiC!1*ULmEO{km3zgV%_3^l_W)yAe%VSpqb$oKU5L4 zR0OSSfv2onyePp5x|4+A7FTgbVoH8FsDdaG12v|=b2*?{9ne16;{2Sl)YM|^r@<mu zZ>r1;48@>BP8n1<m^i?#9uCl^RVEH5E+zpcE+#%EE+!^MAtnLPhE~w#CuRXg0cKD; zhXZwD64_LgVQ0|LGidz37__qrbXGzMBWN6DA!995g;)(}1pr?ya}C1+&^SCJXdVN! z+#;AklQD50BLjmg_?R_FVn7K7q-i4LmSzHE#vO8?UTO+bv4*M&zQPr{@dwmVPE^n+ z$S*F=Ov<U$%>z$VYQl#B;K>A3My2Mb>44XAWTt`7kp^{!P#p)F4}$i(5GRj-&bfr1 zJ_AbTkP=1#JV^t|W5{C;m}Y{D07yOt6@^KN;uh9i2CpATE6qs**B2S7$bFe&YjBlU zl$w)T2I_aAxff}$JTosjr!*xsMF&*9<Uz~RN(FG?1MR@Wnq}ZK<H6M!tN{fY+C+>v zYBEEz2WUwPIQKxu(~HDG$)6448Ax*;+!_ZH;PE@qUbIS3;sj4aa`G{8G4e5?HKxJm zxxnXwK<NxL3khyagLdG7hq@WE*^2l;`&&R$9iY`H;Bh9VVkMARg$QVdGL{E)2s3D3 zG9yEw2B=XR%%I6s)$9o#>rhAlRmY&!WRU$+7^5(VBnFzF1n)G54>rJ8uW3R~X#hn# z$T-lD0mvYjYVZ^zXwY1tJT)f=5q^G}Ohs=%1q!Gy1`WGg93T@w4!Xqw(~m6(Z*js0 zZ#zK&30nKezy{jP$ioOa8;T2caRgj3_EiO-VblsSP$0T6#PWdWix@#I{6da!`0?P3 zV7J2N{J;eg=(rK|-WEF}1H*KXi$F03Iy@U?@(MBf3ok`LU1L!B3yxXX@`e<K6b8^y zy`bq4(1F_E$q%N5py?78m|PlYFD3Zga?n~o$dEJW^m9o67ZkAAPig@lraT+&L?#(V zv^5xr<Fw(S1#%$BLtsaOmp?Jauz=3@u4SoZtzm*W3ABE)h8fi7sbPp`s$qe$m}^*( zRItD%a#<n$bFiDi1Lojia<IeMAhip7YJ7HlQhYK*At$INfU7|dc+gqd3qigD&mA)I zfR}r5q5BPS+BWFOcSb)=X1@?OO%^{tHxSb=M3XT@Qw)9M1^7(C_n>7w+~5OHAdRS^ zZ=kdbT4x4ctyc6G#04!d08jXWx0)8QfSe2(t%sBp+8{0{^B3uZSfI25jt%fZ-$))p zloX(auj-)AJE+nHE$-#w<q_c#<KX9D;Sk{B<KW;B<dS1x<ci@62J=}s*g&(Opdo%R z29+70_$me&iL&Sya-1P!6bpFDi>-*4k%6Jg4qOxXCKf>US0U9Zph6i`YD0!dpjB3C zZekwjRA11L8YuVsp_Esk2|tki#h@5&2VIH6n8E~FHvyXUPhnojRKrvtmBJzpUPn>O z+`*8=$iq-zP{IT%tw5(#R_z8m2V}A<s3HNatA(6U3Yl0cN-b1KOb0C&DuK8c>^QL7 z;2Kkq-3S+jZYpp~%qa$MD+l=uWLgGz@C;%Hc=RwWF*66z^Mjs~nwg)chdiKJ1a3`( zSJ@#-H+TjIt#bke1$gm;9C#&XtXM5$2SXOa0>%`E8pce<g^b|YW+qUv4Z1c1><>Rp zrdw<fr`+Oz+MKG%RP-N|&Wsot7&I9n14f{z1)uX?1UjB>J17r;>||lA(n5@==|M~? z1`n3uT+sl^5Rj2H&=Fs^m=p6Vp#?L<D)68dH`sacASXeNFo!t=T(^NvGh7F91E|bk z;N)VIV5$<w;SNw9WW}1>K&D{L5TInb5@bB6IO1StVFD*y>}kFN;}Ex0mS%=j)-=cl zQ^qJZ=mt~7A)Zp;rS6PToY1B2T+pTN+$qv20x5zmj8Qx(GATkS!YzzZyeT3nqAd(j zd?{in;w=nO{E&;>q6EM>N*3J6t}+cy1szTT?mragB^DHC<b(Igp|()+K{xaigH?hj z`u&nY-UH=e5Dm&i;F1?~g#dVEIztUp4MRL*4Kui$Wmv!rIz0k(>m8_aPgG=PU<iiU zg=!IEC;;6`L{0CAvD6gOd&|#LNPxHzd<HPIF$!A#sQ_Ihnu<7v8IciC^+0;Rpe|}6 zy!i?0GNSb8K`RkJSO0jXfsVz4=UT*o1gh#{@c2AZS2qE61O#MUKTiQZ{tcR2&Pzvc z-hy^XfgAxU24Gs@wt`!xFi{)_vcRX-VCPEYKyGRQ53#^aBD4+ww$C4C8EEpV0DRdD z)E{t@(EXE_m<#P^g6}RWLONhJKTQF8VU0$rUb>z_LV~)no|$?=f+k|JA+tmQI>Zhh zxB~?P%q`G%K2qRD=9hveFOW{G2c15N6y_R<c`5q&MG6T}$7_Pp2W&bE)a0(rFNJ%h zJhM0hBoEpkua%gSqlMbZ*8!yfg)Gof_azzm#h|OLKsN`0?-~FP4j}ifp=a(Zzyc7| z?}2(A?hjCH0>Y4sa6q{uH?aV6_6!@uy|-9EBT3M5?-n;wk_Rg*vH;cH;6fKnfJ;44 z>)-&WSOT}`g~6LC7^_5(hEoyyC_sfXC~JeVH3);VHmHsSH9$f0;{|dxj9H8b7DzlB ze9}ffsCHz`Vg|Jbo52IhRZl(9_OXLUW)i^rEDIn*%b)?V63`NAr2GjzUj-Brpm9e~ zIKak!Ac+|~R|1;uLWCx$-v<dI*x(dA7Li&C#n9XZ+Aa&d#3-{^0m*9cahK4sMDXDP z;A$9d6wU>opl}D>9tAr83Ut9k5$ISGaFigo%5QNNRK`QHAyNebilkfY$%%QO7WfT# zL~(%5qTpew5=M?Fs495l7ZhLccmkb)1&R+)3`v6e_28j@NX1>H6qK5qUzQ46N)29| z3Cc`Jo(HYM0-a(BUKj#8+y$fo&%)^<J4ObEXCMcIoWa0UC4}tMBCvgMmx3w_P*Ve( zq9DCQP%0|o1KoI3%UGcS-nyhv%Tyr+y4$81vXKciKEYhW4C*@;DupwEuI7RGCozSQ zfgu=lV;O204oXkR2?kXDf-5-i=r?L)6RuW3!{*>cF`!ZaEwl!p7Ew^}2Q7<5^&jZ0 zs{A5I8JiDJsUXL~iW+^?i~%Z7!T0YamMFka>js}G3K_xy)tU&;ftE9a;taf*s|c|x z0J1)>$O=^8FoOtiw-a3IfC*5lF0y1~V0Z;eAmEM<2V@5qA7hmOazX)>Xz*kLO3a|7 z0<y9goS?y1{eZTrfUnI0udo9TQh}yLp>5?v=%BN1Nxm*<fV#K@KHQ5MR-n`YI`0Xz z;tM=!iZpu_TAW&}kepbY3R)xqx~8Qh6O>(`1A`FNklSR6GK)b|1c}APrQl!(4JaTN z^-wKnhj@TeB521)D(DtM$Swu-V#or8<ovv{)FRLXIcUT-CkGyjIiTa`KyCt!_m^aV zv}UJPB2{>xyY9e>ioh8cG|>zza6p5Tw*-*=AD^9CiC*q-gRiIpHEQDHe}ZBP6!;7r z9E?@s$Z>?E3VT$6dXAtmMo?p~$fE|lZo0?=w)ZHD1-vj4d{b36dyz*C6X@I}P_71V z@M2%U0XnfMg(-!(7jY7k4`>4tw8qFx15HmPBtXkQ@S?cP5^y&t6Lk0~<cwn2AX!ps zY946XFBP$5?iT0>!i?nHf)Gt6NcqNI1e(MtP6eH2U<(=*;|6UphStT9;6$vF0}TTe zDS}jSfR5%)EXgmr#RWRiFg>*dboU^1j|?~u{04P`z<B^nfHMN9pUuL;z)%d%2+Tr^ zptY%7j8*)|ft;9<f>@Rc>Y{)uY;Z<M1Kk|QR|7hvkZ~bnEo(SKo*WB92_xd(xEhvX zl_rK1##&bBd48-ZpsgoXHLSr56>>G8C8tc_>1P4ZBzFyCHd~P!NUqQgbYIv4X3zp- z@R3GLi948})4<4SM**}%0CngWvL3s%7+k!98sJECr%3q<JhuZHIfHB@f$Rm-C`v5^ z?fQZYSHRl03CJdZirnH<a2FVH!h3OPCZyef;x^E!t<Vix;1OBS;x5R>EYM08@UkO# zmcqJIBn@=nLTMh{bZ9DoxeJ=1!DGb`d*H@F?1QcDg0H1jK=F#6rh<ZJnnI!i+yZ3h z!_CSp2Cq2<4WXw(cIbdsa%JSFK+nL31R&_*rQ#BlmMGMExIsvDI(WnZyb=$h8+}C` zXxghNwGgyp2i&89I}vUevQt4J0Pb*s7O|!%pv_n!`amVn3nD>tU8OmoP9@wpP)dOH z2awzeUiAxEK?O=1I*_?4(2^CTWCERif|~^y+(2Fd3#zTa<6PjQ*FhV<Zm~g3)r5@O zLB<L|=f#3&f*|W*z}Xg@S-}K2$Ab3F@PcwI_((=R$o5#!mJHCjqAcM2%fVD7hMa#v zSp>3<2R_yWs?I=-BXBMT?a~1+DB&y;04*K??a+a?X6`XEF!)2(kD)Cy2Df!V0fxL_ zGC={-VJgc^R7lA$2TubcEh#`X33Rh;VhJSgrotyhK<h5CnF8t-f+o2UlN{g+SP~MD zd<xpx2)a83nn<Awz9Bs!NSq+Xr4kT{1QfBbwLzMo4WzJT)2I{QkPSwedC(<gpz04E z;~+UuB81oio&^Cf69doiWER8n3#dR)$N;Ti1NV@@H=GqK6qhD}$4FBVt^?J#&`EB{ zEG~FgXnq=WF&`-0(c&X1H4U_L6EuMck_Al%z+DF&YC!lHG!Bto3JPl20Zx#L0)Dv! zND7h=!6^?+fRmp)Xb=sQ{J`}wCkG>H;~J8tQO5B=NewjCR16x9txy1U1VCfl;EleF zpb9{ep@^pjGMWe4Hv&5Fm8r@WvTp>`TrADYEG&g@5dpVMz!Ur+ImFlua&b@$nkE4^ zJV4{$u$}@a*P%5tz=O@EAn$;xH3sm`42&Kqcw+{<bpi4>yuT0!+8f7E!&m}3z*-DE zX9@1x<hg*hoR@%(E%d3dK=dF$XF7swJJcCYlW>MYwQz<!z7iJDmYOt1F@|Q)x@pjT zBurICo_V_9<@=zfLndfZBB=aFi~jr~<nCgXv~wc3%uY#BP%Q%0SV%>hCM)F7LePPP z;5j((s9Vt;(4JaI>-iQdIMIR6&jd9|vCbxejzj=$ppCZ%g&%l_3ln4wJr^S%qX-ip zW?vqx9D7KDuKNTfjdajS!;C3Rz09>t6%wH2kp`L(2F=JZ)i9eg)G`%HLFa>+t4u&G zvBW%NpM!=kkdp$)@2Dz3X~PB76aw{)H5rRQv-!}0iy}`@ONu!!wH!RBj+R(%vB!gY z!twF$AP<AuK%fKz+E$F(7lx_=4b(FExq&FbB2bS3{Z19|eRmuIk@3EcUj9Kvpy7}r zP=gQLeFb+>ia>V}K%xj#>=%JDA2`Vtd4qa3z90geH4y|jlY)*2*b8bjgTy%)S(w=v zdBiyQI9Ry&Ik-8vxTLvwIM_INK)Dh$r~<~IIW_RC2Ph^{W<5Y-Cd@_I3=9m3A)xK| z(7UZ5S0I9h&A?;Z$t9p-2Xwjt<QjHJCl)kLl9ms;$Pp}CQUV?@0Uc>ol&XNpyx?9x zxU|hnPK9P}P@fpK{u;Vw4|=#1yj%mB4qCMXI*<o+r8(%jI!MC;+_nN;+=6Th#7W@m z@4%z6DCU4`6WH3aO7OmIxX~~V=I23-$S=xF&&*5Ai3cxCK`{otWE|2^04-_(7xmyx z_$i>9HbIBzfi4IG9Vn2P3F%XTng`gD2q^xF5Ck}KK@kxQN`avIn}Zi65<z7xI1*bh zhVi3Vz$ey#jwA!0R};ksxq$`GNj0EzY8a5tsgVZ{-ZMt=rb37Bn?WbkNTf)%FhmKY zNTo=F&!<rUpHu@np9Yk06pKI(tWt*@6$WZ|<%44j5v1VG67*cNVn2A*0ZNY`AA(yb zpxy~&5Fa)X%6N+h9FZyDEBbKU76r~z>9DYZ-HHaXAL5)M!~i2G<UsiVM1wHcT0Us; z4nA8Ie8h?-W0f5Im?_W@IH(N_N${ZUX2m7;noN-6UO}f2LA$)S#Gu}b&o4q*DTM7@ zqzDEEhAg;~nX2SrCr-hf3`>>qso*p0QJQr4U9RH^X=|go8&o`ki~{9Qcm{y`BN9|C zKw1Yy0iXg0o1;OB@<5IT)s75I9E??RIGqhSdkW-ISa^dpfx{bA^nfZ(aCkGo&$2av z52t{Sv<4j)hkk?|qJskq9#}kp4u^uq18(<+fg&2k{fao<53(K<f+zt`$P1QmFM!VL z0QXEm=3tychua^Z^Q{Q_BNTLuAc{Y5Cm-lxa->9rD%2O4t^|z(ffj~>?zDx4Jm@ek zf-VMaJ#HZ0#h`QGkX;O7gOd){tZE3}7zS!5f>!yaLXW%y@j(%Yly%|B9_Dt?$zcTD z4pP*H;&ug`sRpzhJSDRTUc7;tknltUI`kK`QGFr!R*YKE{Yp#)VkOMrs}xuku%<9A zWL&_ukfD~jguRA2izAJpgcEd&UNd7YOASK}OFUN%Qw>WzcMW3=OFT~vOA{mHxST3e zchFcND1(C*4=UuQ7K3k71`RhB6y+!7q~;dGtE9Yi@WF^0#hT!)&xveI3=Ht94K(Kg zX;MN9ZkSq7`zkd(T>)GeLuyBmS`Y@+&WO4nTva044CNV_IjIUIMUdrk`7l?&j76~+ z+I@k}O2KV|HVQyiL2z|`PD*@gMRF~sJJ9ta)|P{MZP1CkoJ!DQHHDIVOq0Rh12-Db z3=c>x%1A6IR;bJ`EdtFS<(KA_fG<A+&%uHBeSyz*0?C24;)4B>37UR_F449}@hWJd z5Hxv^oROH94jz?-ge;PKlfbS7x3)kjIUq8`!{0C7)!jYb+0og<6~#EDR=+}7Vo@fz z;3>(69Et&oy2L!F!@!e+@N9q>W(S2VXdx^plYy3(C4-j$-{OZR1JDh{plxnN381Au z9H3hc%Zm~VZn34LrljV9E^`FU9v6UHk45m?x4<W4-r_<8>McIhCY2`i5CnE;j23~e z61v4wl3S2-i#fHZ2(3+YO906^;Dpu#%9fxFy9~@cj66&%{9KGepu^f2*%+%ZGAX)d zu<7vP9h6f+jeSrE6oUplLEV%BF7WnVX3!-lSu8c+^X|kM(wJ(P<}vj#)Us6al(5#Y zfY!r>GvvvzFqE)ma~1i(4{T!x9r_O)5Cz?g1D;4q0o?`5S;Jz(Py<?~#+<m033NXd z=o}Y?#3b;=vZ)HN?b4v3HE{TWTdE15^%9w7kUNnf<DUtjA`W?DD=0gH&VmD_&rE3I z19c=piKr;GxHJcxq(G4g-yHy*a0E?1gQmOlkp?J0J4ax{+Tex=XyP5!6^LaEAS=M_ zYfzmBau?KIcv?-(OU}tJ1~ouHxmyFWXAd++3bG~%k`IvdDInBWWfp)8RYY1(30bZR zG7NO^l9FC(db$#*d;!g!fL0+v&Se3u*3V1>ZL<g89)Yr31nw^6^|#=V0Xw1qblZx8 zQfXdFYLOCnx;HgFT^&)9=I6nq3290MJl+f)SB3@+cvnnPssd>2F%@)L5u$wzJ^Qx^ z)M8640dHkiC_zl4LB?4?qr-^A3%3+92nseFRMLao3^FFQQUSE*F%PsT816%;cJNZu z%n}9A)yCOi#R{NvUy8uzH9!mi83kPpovHx6Vq767u_Uz!QCd{7=$7Obfa?!UuA(4N za}iW9fG?zhOw_r8$_a`1q)N~R#CVK5vpHR1UB04dP+wdozC5ugFTOMnaW6OcrfzUi zT;vZLjDi*wJjjXf7Ax4zw|Jo511rD9U6NP?I)N7yli)lKAwa#VTi_ew!5Ipyb_Klr z;N@YIU}OTXjRY-y=fcvo1(}J^3a{cpZ4-DE4{l*HfLACm70H1{ib@!=z~|8{WGt2g zRo5k;Q)n0#GJ+1wtYIu+$zpS0D7FK$*c}*(f>Ky&7{ow#D{(B~tYIqQ0-sR>Iu(yK z(T@?Ss`g9+CrRky6i~v4^*BNP232?YWvN9)nJFot$*8;(Xq^X2OQ5q9l1q_Re#1%| z9fji3<P1<FProF$0K5@BzaTZQSfR84q%Xe!bRlACUS<iT;|!`*N=g!wvr|E1Pw=z` z-N_2l0gV^X$@HLh0C-hOVxB^2USerUMt%|amga)QO3*eEJq6IU-e5nK7N;Wifn|aw zF0%9T%kw~8ZP5OH<kAs5tBJgoCpa|~amjP4g0iu>DY)napLds%S^`?Mh)Bq{m_U_R zIcPIdkzdtmRq!=Ypo$z^gC<offG^O{2M?2h?$}FFC@am$ODzIRm*guXg1ryg!juPI zXa(MnuK-FYu>J|S-wH~ldJ4|@dBvG2po8@xr|%V`c}4@YRtOwKdc~<Fkln9{TmTyJ z0u`|64FQx<F<9lVsi(;e$&KK%gpPx9BRjN}aEqn5B(dZcJ808yeoE>s_TYHWaQ_ew z2*W)n;1&lcGiK(c7vEw5v2JmP7N-`0Vka{%U6UD{!EdqTg7h-y7N<jU7kKmnl*NkT z7#SE2g7Oupt<JzD#lphK!zjYU#KOi@rGwsZ#+UEmRWm4efiSpg28|$s)@-DJu87hq zfvz(F<uNCQ6lMod;~A907?DqRN;F|&U<gPp0^KGC-ZBMSnt)idR*+v@0^N}es#5aP z6cRw2&p<JUKAD&a-m_MessOt7D<c(j8J|KC{Af@3P2?&0d8yWrBgNqBgo+hX^7GUY z`v}1e$HctKk_?cg;Qm%(4k!;)!nR?i<RjHBu+W25XGO&@WuU4>p#-#$30n2|`}ssF zB&L<57AX{$CWAIwgSH?cw!K4hCdk@E@Uns;@Lp_q%><s&NUek{c=GcP0asq26A1G2 z;A)WOF)|WMAgebZ^OK-v3n;OI>TF0K9?2JofCZIOAZ5^oxq=2L$n%R5iz+q2<Nwh1 z1Gu*UsqGR#CPE?w)MN!==&6h#L6G~PlXMD2sUQ(hB?vl;0&EL-3pzAVz+nZQIYKJA zK&>#OV+(Gv7UUOaR%C+i_{;py4?5e16)9h(gKEAEPzA=CoROQK0v%tz#R2jM$og9x zF!vVafz*O?377z7m0R3MsqQu?%YdgR__>%w7^|dVkqsLVLQ)GKTL+DtfiO5{fMyCo zjn*Q*62=rp@XP`uXb~)U%`J1{CD78>RPb>H3gA{6xSlA_0G;6oE3Jy*Z9-`J0H3P@ z-fs)pvx5|ko@t=okU~m6xC?|xfY3lyfX-Bbb|^v(%goO!Rww~qwF<hb4m5p-nC1h! z23niJms&#R*`QmcKzT9&RJKA@L2hdVt;Nt&P|yemoeBnzNzjR?iJ<dbVb`c7pqHBo zpxctlGK=!_K$BqbZj%nA2nQ9U`K5>ij#*%UX5c`xZ=l7vph^ck{0sFvXz5LUGI-)G z5j>FtYE*%0Ah`QrH4)ORDJ;Grr$#`73>^NTnL}8g4Rpj=ei|gJgM$ndl_?6P1xQ<f zLEBP`K)aCh^Po5HLbmB*zadsnK>^eq1vSG#6%aUMfT}jQTS18#oGB5#QytKuCZKXE z51a<To9e(RARz(TWQ>O=DNqC<w`o&Sb5f!Ai6A@)$|m4qH4jumf)-GOfD>jWXl0E; zdTC-&VqQrqsE3e<C_Qmm1}g$!wKQZYAb1-bnvF=wS;H^CB-IMyoy1B=nnv`_q541r z`ruFpMQ9>4aA7`$2N-nzLIHH5E~2o6+>s1k8w52CwABte2VI$8s*nc0i3b#naFcNO z5a}S@DpSaK4Rj;{YBJ27I^d!cbWSE{JhBqjN=!`wt+fO-tBXLFM1ouJu<29Kq3IY^ zIs*g4dr<iV>L4=+gHG*cW3Ez$rC3-Ag{9TvhEi042K&K96{t3cE<JEU9)EIyqz%xD zHmFZhk%sRei3GIN7AZIAKv$<gYBJFH8$9&D`6Lw_1mM{Rn6652<pS#dB$g;7!%s*^ zN=2zE6(Gq5>BJUr*A9L=Gw6^ua58~a;-GsdAT?Ps=%nWS63B7<Its=4po$678H76y z((eN8YzFt>5Zy!Q!r)X`WWnMRR9Pk}z%wJ<AcU_{E0S|ci$Ozyp!}-<>S*VHC)7dJ zKe$3iS)zb^paJT+1)wyTnqm#f450PpAOVmckQTP*7r~E?1Id7P2O-W+N=Qg70UgT+ zx_`Pf58Q|ajV^#vIc!loq)!O%VdjIH`S?5sK5hV%?Vt$*RGA<e^01p}Ae-Y@)AEaw zQ_)j#JOcv*CoAk~C$1`tv44!BOOp|7h9;w%rZCpIU2xYIJfjPm&w<=V0qO!4fkx<y zK!e_p%PByeT=1YU==MO+@eq(!8n~@oR03)lfR-2(fm{f-5s3gb6u^^fpnWgJpiNSs z8-`h!IG8zDIN0D&hD(x1ibI4$3N#M~nsEVRP~Q}s;XrKzP^)<X6KJI)XwW%}1-#x7 zv<!o#st25!pu_&4wo(GI^(9ziei7)T_MF5LPy<^RzSS7ik3)=Wg1cd$E@MFfSQDsy zl%k*n8M4)NO;0aYg2d-70ra}MiW^ClCgUyk#DW5lc1>twEDaQbpv9*}f}oxbAIM@z z>i~2_3sPXhn_l37OmR?R02M_H>_``6g9<6oU?4c$Kz$g{kUi*J;~IvApnf=WRlhT2 z!7QkUn^=^TSpsUY!uFFxvL5W{43sqrASXk{tR3?z6^cspz*FF$6H*g%3NjM&N^?_- zGL!Z76ySHTLD~Y)4mI?ctwdPHR@YUB1XvYcbeyAZRHAN`fv%-qtoAQPT}`H2Ohu`; zn2Sr3u;0yBlnc6;1rz|F_9Fu;d^iK-eNZtE_C9C<MWsLq1L(d^$gS<5MPs0)pIJ;< zEZJP3H4LE9&KiaVte_xT$W+S!x*Z%e2Mr0X2!<3^&;fo`PT)u<KIC9)AVCAm&@(5B zj)2y4fR6h`_i<4bBdBf8QM3Z20yH2DzQnso7Q_YR8Suf8Mb)5mQUe-IVuZ+p(*u|Q zXEV@c6560J0Zl|Ruz-$m6+*r{9TYb3qye%8Icb14BZF@5uG&bvC)L4)nL4;WBAhaa zO&9U%kX`4Xni7<mA;Z4l`U7(90C>qZXki<)a;xG;PC&Y`+C@hp)4}inE3$`#8fbGR zQhox5S}_9ygE=VFm_TI?8%jz7<t}ha0v&e+TA&R{CE#$Xfrk^QKMPub1RCRj#XBgo zfTk`$gS()LAH>&9Ely4Z-*cE>l#2*2bzODzpn=rGCE$bCz>BJ&nMXYynrFZ%2I5V~ zsiiowNeKf3g9F@ih-?D#D=3wKJqKEgQON_j@DzN%iykP8WOISGC)6@BGE@nG)_cV> zfk|f2?JX&cwTyL)pyRXhm?B_@C_~15!xD2cQ$YK9L9;BNvA9Hq0M`HoQv(Z>p&rPl zRcmPL2UHZn*Q9`R8t9nWyfTnkpil+xBZ3S@fDXoklpB6-nk+?Spc0cixH7LKu>yP> zY*8_&L(2xbHZm_?lj#-<$Q`#BF{;y21_lNXP{{CsqMa2qb}9g#dl6!UH~K))4-X|! zQ?pV8QVW5v?PjWB0-ewez7d`wixFI)I59HRGBYw%@szNF_BuB)g3e_~VXS4YV}^$o zsLo=lx(W6seD^cHP=a_DTD>JIB<1JlfR0iE4f`c0g6Bg(*#r`zpawf=%`lb?J5Xc5 z*XJSy7^r0f)eE|39unx#o&~tcm<c+T4AjenbOuX7J3T-asuxs(E)LGjOIKIO%}*)K zNrl(|x*7vix`3|P10Umei_JF?#3(WWMGdbf#0scbEhuNQ6xD;uHgNU??N2Uh0CB-3 z8<+rRR8Ulhfnp34B@7&(7~^0RVMJ*$fYLQ6Ib&Xh#RS?9AH|x&6vYNA-odvVLY5eD zK$jSCf_DfrL~%iP2y;Vs2=joi!UA1=1-S}~4|)|Ae~M^|7<f?;=t3;erB|Tquo$9* zz?WfxuDpU=h9v^N3JY}Ql_K~mEHUU+SmG&=tFR=%BOK~Qt)OKQt|3L0;Bo^N=%5G% zFGhk4;KDA<gfvIswKph>85<aZPgzPWDn{Ie1qu+*unah(Yk(GzFo3SGNnvOP?J#Bp z%?vJJ0j*{MHK&@H7lMXdSi#GeSp15Xf-)CJJa`Z|KE7xps8nSu0^KrJv;kB#Z3Pja z9@j1Ql*}Sf5qFClk`lnv6R<wndXO@3Jc0>uWP)0qIiSb{<uL|EKE^6hztWr>_=R=w zyQx5JKu`_^(IB;8kAU(ls5l0lq5)fg1KL&39G{j~)CNjX(6vCgE;%d$Ex0KF*$)aJ z2F5BS6x%_=G_Za#*!Lj6!3T6fPJxFhD5ZnyQP5-wXyNQa=n5=9(A5Q*`M21eDoav} zJ^hQ27n<O77HIuUF_N<sa61dj${4t#z-#3h7J%*y058)3g%RlPEzmMg=36YFyVQ%? zL0OEbumZWfjA%!J7QcW4m4Sf)MB{c8BXU@=#AhTHBRL9s;|#WST%bj3l}PT9L<uC& zJ|tM&!Ao)!hk#NcXrwV;qK07sBRJw1vKVSmoWqfto(^6_P}B_yCs1I)k~4Tt0%QiH zB>_&(pc`Ck@Hz>Wap6uvNkvBB(<8DNin&1J3YgBSWh!CLVky!CZT$kRvk8XW<;Cm= z&XiTGr6p;)7Mg5DJs`(+fe4U`i$EFX7IQ$PF=(kna(+rGY_$-`54Tv$5_3v1Dn`&f zwDlmbfSS<^jBJc7j3SIxs9_As9~d42g)zuNcn$@%C?IDSftuZ*w8vCb2r3IeR^SUw z&@H&FASZx~WMHh4M~Pr$%i}@yJnHqbM5Z@3$n}!Mr8v;a!44z`NuxLjmf9dD!Xp^u zc(`Lg>4iX=gGAm0SmfagAkYoL-8kI?iy3_G!6+e6Q$Or7OX7kDw8X3r$vLvvg9kLa z1zKGO3K&q44x-@!1nTC10;os|GxY~Eq=PmYfX^@ir|^ly1QO^5<%u9yf$RV!WD&+H zRF}a63g$9Uo&>oJ)WU%Gl+G|PFo2rA;tb#e-xxp}s*6=h7*m+Cn9>+P>)-ky(-okJ zJLZMpWAjs3KzH}mfL6t^LfN1@B^k2VK@)r6O@vG-Y&Hxf99f(TxN2AzG8T1}aM!Rl zGcMp+$WY5x!dt^u!<xe0%v{S}!dJsy!&Jl6%*@D;X9v2XIfp-2pq7J?p+pe0dMAaW zhGl_J3d=&q8rC$H8jc!P8-^0z8WyO2&Jw;FPMCgh&Ccal#Q{3Ou%M(^zse>!xhS)s zM4=iYqF7W59u)-dQv=O|!NN!(5u_$HCruAlGAb6;Rx$B%-D2eW#mHOK0&3f_q*kOR z!)|G01+O;H6fOc4j*z1U5o@bJMF6B%3ofX@u?lZa6m18U5}-cUEf&zo?=AM^{M>@f zoYbNzAX_*=nI3F-(NqwhIVUx*2-GCd<N^<%LGGe?1ZupnL40+K8$!o}I|KYs4y<2x zi>(;k!n(x*Dk33f!Zd(IK$#b*um@dcGYyomlt5{P5p?n(6C)cV7Za$r&Bq8jRhb90 z6oZL}Ns5Vwu}T~@JCx?dLmYroQh+i8xa0(RyMzHU0|t&RCci36$S8RMbPgCi$pP6( z3mRSp4J(%BA>D)lT95!*)KFQF3ObwHFTcbS)|^aD0r!$%g$t<h2Jso#kKnotRN<`! zc@I>WGcYnSRtchb08~-a$LU22KutMlO8}cwL51Ze6sHQKIu){v8x*#nr~=U-Op|aX z=vYvpwH?K=XiZ-9QV3KU!Al{~2|+bXMKYicXckiqV;Uo<`w1EjoyXM25Dd9gmC5fH zqrN5!WR4dcV4#&ukh}qD5#M3~&A4H^_ZwW)?*X|FQeLt!N-$Olpay4J9!kW690(3e z6-dVdymF|SsYn9UE?>X|+RYx!P{N$T1e(nSr)6fpTO6SJJ0-CsvC5WUs)i(F(6nwz zMt*6Df;vpEhNikEOVJKcF#+z0ECy8wgi;HrU33uSK}gF6lt(cWcY11xrX;q}@>}30 zA*dq&si?vBg1Rx_zC;nI<qmG+7lE3mkTMTk$blL&kfC)@tqmDa2USgwbL2potq7Ei zi$KW(90x@pcOqp<M9u{D5K}=O0G%cXIx`M*AR-GB2MY%?9J0Y#tQ_Lt>!MjXSh4q! zK}iaA4^;|t3qur33QG!W3up@tTQGwrdr=#xU#bS{nSm$YQ@|%dDwJgwm6RstfTyS+ z>m*Q;2dMl2ClAQ*J*cS-YGgBlx+P4YwWZ)B0j||SJ_GNAxy1`Q8@99{zMv>IEwchv zPT}f8o(F{n$R6;4j3Tb-=`eR9HqC&BJwdr2qzr_?P6AC>fSMb%j42GYOcj2hu3I*9 zQ3T|a*CHoK#~74?YZ&5L!8|rl$9W;>crNxDP&b()fT0F-Z7)+6^8!wg${40v##-h= z(DqPJbA`#Tio@02UDwmk&0muX+%3Ju6Q5Ze52`>x)3AtadW!>;E5T`N2`D9lb1kS& zge1D6{QMF~CWh>Mgsfp=&d*6HS_D!KP9b0dT!1fSWMH@q3K&o$kAWG~f(LE823;Zq zn)_s7tdc|tsN&QTcz}ZjZ?Nt00w;8k!B`U}D2bc_*$65+KnatB1trOW3JUPB3}{3i zf09dKZ()dH1GRF%Lo{3|+${`I9I2csJSn^_49$#DTq%6P44V8!?Vx072954w=mK%j z&<S)K6Vkv5crXkylZqvof*c1<6Ofu0d{7D_ytj;qByg()mLS1}D>%r(1UTG5dHE?Q z6hL(h17nqlOKMtTX-)~$jYWDGH7C(l^MZz62vmeGkgOKNuo|-_gj)`3?Sh9e;J#)8 z`}!6;v_`_`X;88C8p&n}44a{bpbVeDt2Iy(h4vE}vY0^Q6e*05^RN7FF%>0gG8chj z1yU{&HCO>Ehu<N&M;YBcpeh93V}lN&fFq27fdLdGoD2*M;N$@6k$^|W7@L{;xj<*f zf_8)lGXydOF+@O4k7e>JS`BHUfL%Ea#D>(fkSxjuF&`<<fD;O+fd2?`Bd9onlw9bp z1P#%^ry@YgKsgKSECX<Nq?WNl4ZLGp4s>yN31baY2~!F~Gh;JzEprJo==i{9CPs!r zF6c40OrX&*fnabm*DW(A)h8dc?(dceL<DsG8bVZ)1w6!eOBiz7O-^P~d~PD>64BJ6 z%3CZYl?ACq-Js;i0=dMS2U1CckNAOH+Ifo$DwLc9IYtuVe~{O2amK^isb4_>0IrFd zSQtU~j#Nov1OiO0pC&i9Dj701gQz`0aSy3I4MD}?W)K0+o(KZu2yoHy2xL8|(*Q26 zVD%?zu?0#N;9?7Ovngt^1>2~~!VtxZ<+Mr86s{JAC{FOmE_YEgsHoC|6$8+{zu==q zLF<Dct0zH?c+kQT(0OaA#U*G%xS%==9Q&Z802(6FWb$(Z2P?k32|6f@m5qS`G{wbG zCFYu2P*MqVg`Q1LVs27Oq8&<=jm;kL5EDVWKxvvCWEUvV7#ORBP;CRJXRs7>SP;b~ zX!o9=C7{BF3&|2RFTqAF;28&G2?!&C4pcESLYG@GLVAm6i33#A@#3)~9(3wge7q(X z))WaUqaf`$P;CH7j38Ho8#iG8Arauj2ud6bAp1Z?2q-bKF!6wvM=)crLD3s+so;eW z;F^&&6_gY~yK-1>@kC`7_$KCMrh(E@l^l4osVcJowEr9|rjS&cnUexts18p8u<{Q? zgU{E8RSW$JoeYSBemfXIv&EoGl0oB=HB6x4J!q*2T4KPG2s+XXY$a%gs}sm31<*+l z;FUCqMU@K0nYo!ciJ)copjCJZRhb2lvIen453U>B&o9=2-f{+7L=U>y3cR!ybiGBf zjzVz>=tz;M%mUB6G|)X_psCnm=mZwX{?Ou7<n<lkWy)!p$>8Hy6^c^}5{p0wQYmQU z7wZ+L7HEQJRzUMxpeC9E=$1yfTR?dfG!l_ml9`m51KLLbUhiH|Spd3iSs^?#FD1Vm zY5grc9fA@*sLBJM6bw3Hq=q3@u9mTeaREaL188-^LZ%MrS+8l3Ymu2CnY?Hrcx3<! zWT*r*KmxiZtKb%UdTI%1ounr8)L_tft|sFx)+*4L1|)@n6Bp>*U=>i}0=a;NrAie! zS?Gb&0G1<zK__UkL-#D*Vvou!096jRI6&=FP-PCjEJBkRT>OLUxgu>)M+}sYG#QJw zgGybH<+oVD=1YRC2bc4lJWO0HJWN$Wn2zw%WXGDFz~%UE&>#;Bs7`_S3}g|61+u1S z3nK%A2*?sp6$v^xm`4~ahLV3k<tDf&2X$4Ei}F;^7#$Pn(CR2QXvc>=1>EtuCE}Z! zn-ALLf$ZKYRd8~ENrBQXD9qs*3mW~PJIo-tFFrRvrHU^XnimyvOEPm);TaC(ED#14 zP>>C_u=ZyyV+k}#WU<tO&VFOaW-rzQoi!rKki}ZVl+6q}A#MR1sOJG5m}IYE2DP6+ zDr^`)q$EQY==Mp*s&KHAL3sgG?<*w29Sa)N11EFvayZcHapYsR;BJO(p#wz$@_A93 zoZxmMI1Sw5$jdJR9pIW#1X@>qivzSl1LW6RtY9w}fnpJKEf>Qr4w%8v1?OP>MF&CY z<`9TLi{Cwr3=F2A_yrY^3@o6Xl476+15=eGEEbR>NDt&nKTQs->4^`Nl(;|%IR$(> z4%k6OAR8bF3eD=hj0_C=AgiHCi;;(^2qcD*v_OR=IBCtoa-2mfYcr@j!<@nb?#`gi zIHz(!=A4@uqqw27&OE8Ska_23#wb4M%rk!qWae1_I`b?Dop}~Yfy_J$r$A<&MW8d! zqTs_V7^1|WGtc7Sc8Fq82dEvQ1Y7qCzVkD`s03W#Rb>`HCYV#x)6v=<@bn3)dcYL| zc&>~QbY}rm7IO(p7OOZz4MRK|tUC`GGJw>0piz=r?9g3rkkqmj6bGQ<1=PofHD7Rb z@I67H4{`ydnH-f_0B^v+r-(si8>oX1qCrZ*nJEA?qsF)ZQo1sN%39FTx>+pQOhq!F zvK4f_Z4E;f+d{@7s~W}<b`ZOn5pp?0FhdDP3OLJUv86FVjyVE*4mRH=3E64|+V=@M zmM#gBhtd>Oi#0iKu@!+9eH9=)3z;lG0!rGTtxQEnL9CgeP~dYc2Hi89nV*L|Dtn79 ztr%n?Qj!D}bhmipK^0|QT0Xd~?F$MSPy-gcd6*HjO-TqeSSyJVM#wtgr4A^?q6QRr z{!^R*(#fe|$O2C{iZg%%hp7Z~6*p5eV+x}<^!ADcY@q2#P#?L3J%tH$WO)`7dO(40 z39P~sP#lnO0Efs5P>6tPw<1vDC<28Ic)X+NIHE^&i=!&D0KBfC=mbbPYF53)77yO= z8VL#&P=}U*8MK*N4iqAw`Ua6|z{=n?GpKb43J!3Z0iEmt8WdUpo;1&526+%PZOL+r z4;1wAuyU&yQeuG8b`dCAv0uk=3zWt|l{DyX=3-FdWMHZiMvfh5<iLBzpi%~Op*q+x zpe?B&#}p&>!+>^+F)d^Sm-fsH8ERQlm=>^r7B7OPq!u#Puw=6pg;dDZu(&Y9iq*2# zfTo;4^V{s82`11^%tEVh(BK;z{JctLzbaFBXBbqEfr>^AO$G3xZqSK@`QU?9K@A_! zybt8eZoR6^0&v4blcNYcTm>3<y(IwOGZ9~s4+^eZBA`Zpd@AU?Be+~~5qNCtG${28 z#)H=nCWG$3gwDY5LX|^IfSo#sST1o2q>l}3B&4s2mPf#2vFV^R09uy;n)G90WMc-6 zeu*%0F^Vx(DI$kI%1{8z_wb|v$|3Ni0h;Oo#RmA;3vf=TWh!A>0IG38@xfff2)PCl zv@-#erofY6;44x!S#EKH%#JV4tV+Gb30fN$53Uzkz$9C4Hi*__fu!$Z(B?)KkkX<n zAir{gB#TQDa|_UXdP@i#x?tlH^HRX3mw-GDZfY^Hfv*6ql0)_`rUrP*1LYWyMsUgl z?ezlX=>-f6LH7{3RA_<L+AL(Kft-OV1x|mAHPFRFHJ}@?m_XB=pfk_FBc-f0ETF6d zPJf^&PbNu*g^V#wwXC&lB^<>mC7h7it;#1gj0?c`e%CN8;HhC+$heTHmc52y0WWC6 zb0JevR}FhGLkV9B6Vz1pg^Vf8y-YDowH)9(%lT_KY8bKv76?N0GBT7fEfA{V0G*6m zB3#2+!&<|d#snG%0pH@yS;G#>1C@LwqBWc~>>%-QhP)USh7zVMv23mhj72V>#lRp_ zvX~c$*RU@H-Ggq2aL)wBA{nrYn6e~NShATWFc#UBNY=1}4p2at2~yF-068`xoFPvE z$@~n6`8A9Sq(H;p5H%q6nyh|Rc1rohdXQ~@O5pt-Abx3HPG(-V5_oeWsJ205N$}3F z%wqW7%qmVj6=-(SWW2?kl37#)I^<hZ`W9P!W?o8aMbQONsR=G*!Go9JeAo&Sy9FZ7 zf>IlAc#vm^YkY8MK!ATx$SrnHe{j77Ui%Np>fnsa4I0IUu2H?k5uck~4BGl|ixsr> zI2BUcfhJ^bv4YM^NG$>-EXXziP%^v43O@Vd7F%X9C|eYPx-LcBpbi9Rn*nSJ7o6om zxg9KjizO$qxTNSN$e}kt4&^LLP0RsT2De!9OH0yjv6bY4*3_eA60o0ZLAk;O+(6)A z6k=py6l3OL5@BKiUy#efD8S6a$il?L$iyhZ1S%x>7<rhO82Oll82K3am|2*3z!SVI zj66(2OngjLvM4zU8shNc4W6MmLAy0zBZ;8vN<di%G%W_oMBvQ8T+0GZ)-0d~e6b3s zO;Q3q*cr4wAd9VrC7Zd}sfHD_W+0on$PJ{Th9L{Qv3?<AEn5j!4Py#ZGgChw_&!?h zg$%WzTdkNOJ@Fd08jftx*=8(N-tgu>bPZ`pQ7QOjU{Eg?6bImd1TC<J#woZ(2%cny zRk?5z+`t2#ewsW*@Kgh7=z!DI6Ho+!oByEw+2B&_07wX2Q-YF25vUDc1Rf{l1dqNz z%SLc>2NK;N^`JP0bR&2`E`Xhjbc-?V7BASrFcI|lzR$?Oumu#~pmAje77<3!rD0s4 z%a55r(|tmWRpKb|msuPS^)tNK2Nn6CiWpoJI)Pe|3|R~*4A~q-Ht7tYVb>JU;reo* zGu0O`f(o7@ks8JYOf{g+8mI_^T?Po6A_6s$K_gC};nynuyhPBU=<%RiboELqN~(mx z^%y+u6oUjcS&A-!Lf|eaLx_S{p!q}CvMsO_IK!Z}eu~aBGB6wg`5W9IWCUH82D$)2 zgb{R-42q9Ibsn0%aIb@gC_o7p>~+wIla*|sIuE?U8FX597o_~k1O-D1sFmo#5E}(< zGlF{opq5F6M-6jP6{t_JfUSl(g&~CzblcfN&=F89;B&LHK*v8xGAv-PVNPKL)eDRa z0StvEHOvb*7BZwWf@EzN3PER$DupwE=h?th+lT>o(6!^5oVPeZdt<-_+bupv*olph z(h5|RL7I=?(hl6D1ebQ;bI1ijO-kr-9L$+{Dd67cEmm-|@D>~7>>2cAb%&9G;VdY4 zWkAIUBWSe;AGpQM!^p-c!pH$CR+z*<fsNYM1iKHV*$qlv;NS&yrod$a=ty!%6Phub ztw0W3@iKubUeG!HpytF$P$~fX3FHh|QUJGs!8rykDS*Zu?}6M3YQHcraxqp3pd^5d zMAY?ia2J7EOfVOL)?gvrz*Gcw1K4^daJI$P1P2d$J_6YcZtF6F$9V#Z@<Aup6zSnx zj0W;S38-PpxDeFD1?42hg^VeT3&A6cnoQ8~S{Cp{r$r!V6oI!(fm{XaK!U>qWDq3o zKpiIVl=@R72Z^8r1ZXG==W;Yq`2h|L@Cs4Tf(xX@s*vCSFI-vyN=?u(!M0ZQA|nIC z3nV9?_Rb&~5z^R&ClgTU!3!W_-2obRh6M#ScbsEnV0ew>4jGi7fOi2PPSKRWI(Pyu zeL%w>MQ1=s5;RZ_2?<c6plB|r!~!Q%(Aw&vGLRB*9RY54fC^@CDFul>P$C7V7jPUE zfkLSW<U~m1p+zHT*uoj)cF@=zc!Zph4YcTihl7iUg@c!elf#@tfP<4m5VjBkWq1Y@ zoZ#UZ%t;*d<qp{Ao>O>&88mr|8bC+OYB4e}_@<U5g4VAnWF+RL<fImXYfH#&(>b8~ zv;({$bN-NJ5s-a8p`a7(kS}$IFRQav01d9f%+yfQ2UUgoCHeX=W0atq?7@36U<WQK z6s3ZPxxu@_!Hxm#mVz4!n?!<*nuGdpF!Lart00G0fexR5UHuI@87i|Fw4DTURt0Pu zI;fEVt8T%=?irAobOq>Ec91;OSt;<togh0wP?9t#9>66Zs1XP$*ui5ejDDJo;4&DN ze8DXVv?KsZYyUt=0AvaSW0fd!pdprefMuZ*Oz?6Iw44F7bR(N7AHIDj3o_LWTA~39 z7foigh78O-*y>wQ^~}f)+l<RtC5hr5&=Pc5T)@KsR2;)AS5R{l>?Y<Sff5GD0x8fu z0BDQ~v^^z-wU@b{4_vjffKF5dP2)n_bqotwLEU{uh8oaZ3!7gR2h0am8h-hpGu$Dm z6SAL50VWA*-ocMDhAtQf&njp#-Qq~iOU_Tp%uBz;25y@dYqAxs0%hk8P$mX9*}#zk zYPa1IfgF01pBE3^*a_Mi1RKc(ht(TU3!MWN07zLHTquJUMX`W_4rDF^BL^b~lL(^_ zsGdR%L{LKoW(GVEK`j(`#2SHT!WS@r7Q};s3f#WXOJS~Mu3^q%Ok*fv0v$hD%TmI; zfCbbeWrR%Hv-lN*jCj9)FEkjcjH-)43tK@suNHMjeL)dunPpC;LP{!VB`D}Jd4<pr zH(d)&)}lU8;2>7CW`npnpy~k9xG4Gt3I+kBK#B)#j4g@;smliuXleW_BLf33C}2Pt zgn<b(Xu$&77^8@iwy=dhJa|CqAC%6(`3%$)gw(2_9tLQR4m6fU!V-K@kYhkbf|lT; zI089tAWQH;_rQQM8v60!pp1*O7!KseB2bGKDOG@j0h}~IMeHX~E(awI4leL6ab^xq z4i4-EI%ruL@>C9J3ln7h8t9JEqDD}G4H|cY6|SItn&8F=xWopX;Ric>ATzZXM>(ym z;F4OFnv-7uO63Zm!EvNxH$e-zKm&XVwhBn)c4BgNVtT4yVs0vE$V?ZcKndP|0<H4` zwOkc!74nPqKq*cSx^+qeW|}5kF)aBj*eV1hmSn*Ep#d{Q2jn2|E)|3x(3WlR_%M<U z#RWN;pq0;{DNeAJAOpZ7eQ-N9qYYx=_JYh%utgk1mYJUiwlgKONCy;%psELKhb>4Y zn56?Rcx+*=hSpo4X(wfc&^*wxtke{ci{Z1pnW@ESp$T#wuF%viOD)nZs05LzCCQ+$ zMFcC%PV|rh`442K4m`B8@-y?mK@ApGhb_=k*F+6MH1F$y&VG*vbv@z12G)<w*B}qW z#{obk4JZqNb0m0t8PYEVEhA)v)qhOj#ev{urLg8bxV#0e07S|t;5-7#P`aRu3Cic7 z0nRE><g@{=3;i^)-@gjdk7Ony^MSI9B+OtAAr>aGGF=mBib(;MQbCCYk>fy725A&w zFR&n$Vip6aA_UJUf$mjeh-ax`%wjDvC}GTETfkn!2->NY#R^`B$&tqa<}<`|)G#dI z1dXYI21zuTs&t*f%^J{DC#<ywZKD(^fTB_%5j1fNS#*$E<fq969><3?0Kol4@Ei?j z*y0u&WF;!Ni2@nC2DP<|Kx-kPEreSfFoTc+79LrqpfCj$XbjAJ;0?xNpp(ZzOI2Z^ zM1GusLfZ&rJ}5DOTE>v6dB$6!@t~XuzQzD__-z`fBU*%`-v@GA4I`+guwj4%Ut$F# z=uFr2%wo_1Y~V}8(2Pm|EwlugigJ@uF=)d`aV4Z&Qvh9y1}#<-U;z{lT0RE8^Ayx< z1aUyyyTSL$fZCRjUC^M7tV*7_pwk*bN0(}#m<TSUpe=7rNJ|yF1Hrf0fKGmaoTHSH zSfZl<I?gjS1+*F@u_Oa*63CI@(N>UqV6FtOGD*x!PSsJU%uLNmDON~GaLEMC>Lrze z4#Y}GfU5xAS6!M1S`Q624t$IjsAK^9UQa;*bhcJPLP2&q(l8Gw+~V`|z@u&n3E;{I zbog~eB50F_9;i9|3)GBYy2T4~5IERw31f*<^c2_0z`)=FN)ez!hk+fQ(Lf0Vgu&$y zbY&w$GidoTBlyBdCQzdZH1<%#*bHh{GFIt9?zTa;6Sm40d<-+__M`-mSK~opn4rmA z1S;!_)`HrNVE41!;)F}zVgb!475xM?iP%8?Penf+8GJdSAIRmPzAxx>elA9MDGF*g zgM>jvQt>(HnA`%;2mxae_)_K)rW%lMm}{69FsCptWGpfQ4MBmXxl&kq!7FNNn2M}G z)8G|-HOvdxQdk#)M)4YISxVSJd#H-qpgXY`Yd|}<SWCD|coy*1u!8nfH8a(+RfN>A zxiG|Xfks-vH+q+aGZebjuq@zP2)gSVG>hzpW&#t;gl5KCjvCe)j(GkOmIVT!0j?U3 zh0I`6+`=J;C$LvJfRm3~W*)eP1ZO1BaxGAeQ*5nJkY8M!nUn)M&oHMXvmhr`AuqKU zbmJkYK?3P(Rk7%mXXGID1~eJLEl}`8T@{xeC?3IW5lumGSqEzLrxb(MFBO4G5l9;i zblJ`=UQhuEuj?Qi7M6k9tKiWzaK!`~O}ixkibv35_Tu==Jn)1cCul+woNsS&!<nf? z;L|t2wHwrI*nzE@oZu8u^cQ6MKM(<KGqV?$CV|q_Ef52ggo?nI0)p-t0}FvFd-QbA z#Kgc53Q9eoF#-k_9%dHsu)P2y3lrqJG0^IF(8WJ|pkaMRHpU{54tN3sC0)?89XNY{ z@(H9MgbX}^?b2jMcPqH+1QVdL{uU27IP&tr%Q=fdP61~@#v)E81_t;LD@Y8~i2+*# zYA}ON6lq}qE%pH|*#Y(adO`V*HPHulvKZ)ee9$f8pz$hDAqh$opjJpR?Cdbm8oFFi z(VLQ5oSd2m>c}bN7r_?yB~`-i^i{|!%}oLwgbYq=c6N5)gIkIfY!%d#5{uMz6x7r5 z^Fb8!xFRDxb3H=?P_2z7Xap96n-ZT?3A?#B9^nKHup1$*s%UlMj6^sA<RD0c6vdsv zpsfle`T04;x`uj2dd5kHV5jIPsH4k(#Yu7^Ruiz847HOo*MW}1gt(nDHzLd-<WhJN z1f_LQ5)5WwU??^M@7w~fIfKm6f|4SrzYIPSX(3|`V>)P7mI>0gs$l{x`V3~!WT`R( zyBpNj4M;31PE|-vOwLdMEso63OU(n_SqMs%;MN`}9l#ZX53Yeb1(qAYP62i2(iv(P zVg*3C0qi8kg^UxK3R!{~U|A3}Mh!Xp=r(8xI%M_ZEf&z=Jy;2Z0OiMDTsEK#19FjF zKP)%0F;v-OPpybmkVx_fL4;YFY>-wWs2se-0qa@a;>;{bEdnRZTdc_$iJ8z1smze+ zOJ>kK;YUyb2QDwb1jv!MxRGq@1i2Da%Q3JBFp4l%X(P!Y<tv1vkmO<avKBdmS`Li2 z*oyN(3pX^GiV{G!3NSH1f)Eitx5SXNBN<->as{XaWZ>uEC=vpdU7!R5n)d*WOMvEb zl|cz-4mja-Fg7!GGL|rc=pqx)d}aq@2}=iK2`i|v-T|tinVOkWm>_j9_yBPZklI@2 zc7}GwG$!zhOO6_5P_n9JDd7aw#kH&zb~UUn46$alY%p_b*g#7IO1L^0YuGv%nwe`k zD#U6yKvVDFTA8zk6I`FRg)<b!g)@Nc(PXPKBhZ4$2bHSu#wBblpb}}<7NiPAT=xV^ zui$mOpjK23XrT>b2}1{C4I{{1MNH5;0-0caJH}f)psF`MEit(yzo-(nVD}v)`GPAw zaP<dI6GfmkyUSp)0J<}?N*-LbKwFH6__qNa!dOvIWT(k}OE4a^{4y~ovnmyGbX>|U z0njXcDYV}Ws;7%U)q4>mC@p|Gdx&%l?$+Gm0iRwE$~2(G1E82M5@upx(Bwj|_+El` zR)dZPE=es)O}Qlqs-nS-!1&a>lA_Gi;v$gmZgGH)YzE2QVuyMjaYLUbQxU@J;G6)d zKB0b`0`fj6d>NQHn7{`HGD<MBFmbT)FmkYh_FIGQv*Tkdl15IRpfU}VaKTk8=(Hx# z@@mlFX$h!_%bdjw+F8^Lo{20{C}9B|p;2s5!dk=F%vfYl!UpC$fg6xa3mJ=?N<eE* zIGRDzx6D<R-~tRfeGXd6UR(l;QAqn8yqX*w2;klXC?FuGRckU;af0e1aN7&H9R?K! zt?$s}gfx*%L3tHa0u+HxPPruwN;t5NS8+VJSq5tRfX4faz%8;^P)rDbW^Z!JQbAD+ z8jQ=n#qO66>aG-PvO=0xpy+^vH|QL+TkM&|@gQ>`g#jYrfns|LDC9vsLIxHNMge9H zCIKcPMsPX+wY@>502qTZ0(eqI3uDbIWKt!SHH)oCE|n#U9h}7(qBtOns*B{97#OO8 z!NCct*^~0~b2OmN)qsw{fKU5^jK_hLfKntviH17tz;W1+O*Et?hF2<}b{q(U(*Y<! zK-+TA{W4g0eca-Rj|Vv=KK?8y06^Yj0PTK;grgoz65gExDF9)x9iTE1vSUA(0X|vD zc#8#8B|wJ=iX=g~4jj~A0-WSI;^RU6)A;yH*zJT!;u=|10GSB#9_WA<qg&kZ@p<`q zRjEb!@$p4UAUUu_2m)j!IP{N#Yy+3&?4UI;Y>X^SU~zZ=g35c4JlJ!f6XYtnAj^J1 zi@HF|nM#<`n6kNwlpxCiA{p}hSQtt`=PBkfGJp?^GXM?QfXeO?)-3iC)+~-R=4`ft zuo6ztoJR^%Gjj@aHWO&bzBsOl0n`UdVL~}j4!nn@$`hPQ9HBSNmgGaOrAMBN0+lY1 z!<<12qd;fCD-`GFg3g{zPAvfS)M2afIm$Ehz*8H3ncSdE1_~BUE=UQu3e+j(4@fP_ z%`7g4EycYh<d<LK=mNWf2E4G~7Q25igaKN@l$U>t-PO-O#Kkk{7MrW1v$JdPEjCv_ ze^<W{@cudIRRcw!qs(q`W~S%mgYR8H&var;3=G#mF#?+DWnf`q1T9--VH98yV-jEj z9lcWoQUQ+}P=td@2vBYW-}3`H4*<0KWFaH8)x-=soUX{Kgrx*DQ^c^45wvhOo2f_- zR3nvumVPocGu1NXae&r5gGT@uvKSX|fOOR|mvClrfqKm~OeNeYOua0iS{0;Eli3fv zqEVCa7FR)0YBK2Fq~ugh9!Lm++CoL(rDULes*vTopil)5!GkAGi<W~z9bEsgg3@L! zsQP08kEz{a0dH>x_58r~26_O=FflN^1_cnP?FU)~&ci6g1X_*-I%k80u?Qp&4<1m` z1q~K}g9kL>3mVpHX6#q1Wvq|`@0Sz<B|FeYP7n>cNgCwELV<8lGGv5Iu|dj<DnoGc zgR~()r<|sOw$CYm&K@a-j3I(LVz3<)V6~u2TR~;#EmqK2Q2{Ikya6RJ7LZ0Xzun@` z%g>7kn+qzqQ;UCr{0Yi>3@o7KJD{4c$Ou%&fyy&b!3&ChkRL&~7;=|H2Wa4f5wST7 z<V$e0f@(dcW+upf&=h9yu3DBV$ZhbjJ|!pvfrj!D^Ay096sR@=bt{YWbIMXt$M(QJ zEGSAX1~u=YJF1IP(^894^O93j!1W(wBmy28paK$<R>7?$P`|u}Ayx*ON}0gvmbrrg z)Wui`9-%3Ox0x^wumGhkXv^sqb5Uv<bjBDGoZx~D)M(=2fKJG=Fjgs}SBhAgO<?Vs zEZ`6>0yz{s26c-iFSVjX6Ph>$5MBh2*A?I5gPNQI<#U5->3Hx>E0Eo;Fvo%2CCkLX zzzT8~I96FXK+}3mT#Q8^@mpM=Nj1=zPihh9oEGpzN^wDAa%wzufU_7)7&M2Hn4U`f zK<+Fi<bhmJPYlI;@Gx#lYI06uQ7U9G0A#xY%o<1?Oyj{@ERI4Qy3NVV2A!OrS&Y1X zA|*8q;b2&BX~4!yK_k5-8Q|t<r4ICPO3;KHjIC(}PR*d+D+nvYk0AvoV~9RbwkR!5 z1vl@KGct2PNgO=02OZM}nFkI`*g6o%X~&>(PVj9bpzGB^HyxxZz+9z}p9GpYQ^)|F zHl71I*a*@@OiV9I1>KYYx`iaOL;-ZO9wh$3U1<1u)Zn}d8W)3%dY5FR!mn8YSqk<M z^u~!q(47kq^$;gOPGwYx2dCNic*Na*u&rI7S~W2<PazR<3VLc`X=Yhs4k)V^mx8yq z=qV_;<rhH?Y6TBeBZ40m06GfAsgN5nFh{&|QseWAVeyoZ04XUzL*163E(TN4Z%`R2 zh>;e+SrkHmvr`uX1A`1GJAuj;27Y*Z4AcYzmHXf(3uuJ_XyZPp6s%!NVa(<z5&@Oz zC5)hLtNl`p3?+;Um_e%s7#V87J19Ua7eObrLdt*8%EWArA`h@0a7PwgIkMESfX!+s z0WHC0Sjfo2P|E^p<kT?OFr+hpF1Re=1`R_qGUSPr@YJw?%G}~9CA^?Jv6`8h7)$s{ z_-jBVGHVTM4S0J|4NEgiEn5v+3S%~B(XASmEbsvH0)ZMf&>Hp{<^_Tvn;98OglgD9 zS7?Hc0ILCQPGqfeb<Ha-Edpf>(8X(sx!@ugoIVvGSIdE}uZAas{4_|)1|=T_jm$Lg zRc)y$ntr#~z%7$hPy-m0VB+Je`26xqz*8h()2uXwAp`rM^$oZ9k`qgkGr(&Qz&9-M z6oXHPP0P$FNiDj?4eqBx(pnKHDvDNuW&=QL^=`3(CVPr+aruHziVXpsB4EqJz;KHX zblwYS?@nr7Nqk;0<V+vXE$@(-1W@uQ0<GJ;#SPlm2ii<onv;4<Fuo`iyt@=608Z4J z9Jjck<rXMsLOMR6`3A^(bkP2?TkMc*RaC?dYJ-4VEue-VB7NQBf+o@Uykb32G6Pky z49pyipzFy&HL?h}Hws!34q93Z5&>b*nO|&-AQlf}kq4;02G!4?`Wn_J1@Vis!0S~~ zm|7S>l^<xxqm!wfDUA^{=-a~4$p{@10qqgwsAUFCY1A;Mu=g_6vZQc;bb<Eufcmc` z%r#6|EG4YXOhpMbEFg9YX9{O4lMO>28;BpzlEN9xpvhHL2rd(XARz@U2KC@&0Qd?6 z(7hAjNh{FV1E5|j=!O<hZ2%rXPE7%ukepvslv-Sn4;fkpUk;j@S)>3TIsvPNsDw3C zK=~8YSOJghftt49kv$$z?GNg3BaiAa7KuR0fd8Q0EF=0xmm+RZ9R`XFkeO@@RjL?q zk5spVI*Z^jKX@wy<RVb<APgF{0-b<c$<+Zq8Wq}`VMO#~N|;g@LF;7TM_TKHJq4;F z!t;x=6N~aeQ+=Stbjqei2H=jqvZ<jlq%Z@iy2YHCmj*idl@&DMT2TZVg}B9<mXn`Y zqR9wu-D)!4;wY{x1}9mhbSDfRdx1$nHf)4|{0wqAq*uVlSfz)@=U5DY2LUJ|Kq(O% z1fWA9Kr358v+STw18Czp=oqmSCh-10#uVlnCT<4Ms_j~4&|n@&9c0N_GdOTGS*n8I z!2%r-0ZpFf7o~u1n+MHMfViN-1aVdr=ooa+T~wex8EB>gmUQ3-6@kvh2VcnuI)MnZ zbP3Y608Pf<Voe5JSPM=j;Grs5<BSVr38?HSDZa%6DRv;dBG6c?Cetk*Xo&!BSrz$# zay>Z1gX)r7A}|MmrmtW@ABzZd9`H<2l|G(8$7X^iW04sH+Kdk<0!YmXMV@fy!rctc z3+W&yLh=GAtia_gxGWO{X;=m-aX}?3c(Jr5>n%>urL~as76eiNDhZ2%K}9b|UTQf+ z0%U<Ea}ih`97?_*m7q{6a%Ey*@CDfjTD-!*D!|0U$;ZjV$j8LPD8K}kg(ovm5(A}I zkc)~zmmPpc4M2-Bs@BvnlrUwp6^VhXROT!e&^9{AjnOg8wM@03C3{Ro6(ww-vm`*3 zatTv5dyz*8JA_{;P{N$W0opl}#aYW3&X6a^!cfAM%>`Oy3>t$d;RYpIP!$W=QdPnP z+D=x`l){+Ku#jm1FSHT`i86ph7#S+WK;5KRzFL+NK5)g##K=&%0MZF8VOYQqa&-h` zH3UnQr3<u$3@#|4NlHN-$^g|i>fqItNG&3m95`8H)TjctSmHBt3vTfwCKr}w7Ny4L z<R@nrS%JbF6n2nqF;@|2RwEOXV~V0ck-8d0fGbpR^u7o6sKFKGACLs7js({|w|GD; z#>8TXshX@sZXk2P3FH$<3+QeHNbLxUbwn8iwj>`E)1U(?K$RX7sM=#<V+4&ufT}<a zMkYo9Mn2Hk1S1a<7qbvEy!{1A;P9yT0#6Nq`q+#NRYny$;C+(dsQ?#H2au_R1+>rr z)HAJNE|LJ9ln-hZF)|cNfFppZgaLGoI3wtgCC~;Y<|-HDwoXA&YFTD}X>m@aF0|*8 zf*J6j3H0Qg(v(z0vj^-`&^Z%fpzsI>5#SI9wNAhRSJVRv$4F3J!~zK*P<Y*9hsGtO z(SR0aAT1L?VFoI(K#LZbz)M+K7=@TX7v6xH01TiVy`bJDC~Aw{z+nTK+=3n8m;%}# z$yCcy!UCQCP^e+f0!@Gj)v}ea)UY)(*05$X6=?)86l#QnuU!UDaIjQ4Ip^mVl$NA| zTIG4gx=@G08-1XPDiJ&d2RZc&wA2QAst3GJ0#2adeX5|c1a*eL2;?b9sS8SRn(Rmu z0pLUhE=oXcsass|*@u)O(BUuOz=jZ@QsfptXsiUO2QU{DW}u-G24)H9fvIfFMKPeJ z6DTQx!VN@&>TYnbfjHoCDA?IOELh!w8auc6^Gb7akZj!uvK3TvGB6g!g6smB53&nH z!;>#)XAY==wg5Ut0cNv+Ho-SDE(F7122I8)L%;l@T=0a80wj?2Q!<OdDG}0T%+D=I zEXpj-&r>KUEh@+_P6e&1h6ga@xD3!GCbu|1dl^ABS<!w_Cx|ybxiY;x6TCbqIYW~X ze4zy-D8b$Xg=Z0HN8t{*Z<ydkFvugIwk9~xK*~Xm2j4X+2AZ4$?G^_$dul+l8cc~C zup4=u^Yb9L0F~q`1o#JgMkp8=7+B~i<mV|kgB_y-x)nCLJVimnSQB(nSV>}L9^`t# z;>ujmpb=u~w^&ah6m)kNxN3*3aZOADpJ<?=sZgF@lnv@BgPT&|J%%}%xtS%2pmI)6 z!BHVCvjWsW$S>AQPc2C<Ptky^ASeglb5>B4pOgq%2a}XqQj%Jv15ycbph9X{Y991r z+I-k)L0~6<3vIAP#i^;e;JX=<QbCt$rlb~UrswJDL7H#3*dW2K$qMPYfEFV{njoN} z^A<bQ2RPy*fr)`(FFZatia>mL;RuQlc<KU8xL0z3_CH86fH&4LWOEhifNC*Nw-nTU zWC3q`vjHE*5DY2=L6OA>8e0Uf$p=NfCNm^e>;|=%*@{v@_oAaG5m2N01jtF?ktaq_ zVGddY1J2Lb(+eoOgIb2*B~8!`5>@8lKy*nh0gaF6fwzsOXM(~SlwuVU3kp&bLDzrh zD<px7q15zrNO)GUfCdybnIJP;p!qD=xELr|LL3WD%Akp?3m|ubGbT$Bh>zkvQ27Z? z&yb7>3Zi^DaI2IVOtRE4fELj#gdEqv3|&e^w2NUgq@b0_P^ZI>?L_RY&}0QW43Q#= zz<XU?LF3qv?JE#3fjtNImnahh!*!6qKxG#LD+gl{NCfUPkSM6Z1oj!MO%7^@gN`Zz z)t#U-e~K(p7$N8Af<|${OWK$v8ETloECxvi(0Bm2SY+}87v!33kTM&z#}V98zQtag zT9Q~&QUpoVpw@#X3#3H=Y9fPIClrCIIds=MGchnc1i2oPdLWw-xEPB-;&4BJ5;n*m z;L-LpaLrc30E&}lrXrh)5YU#`g$ynXu?k>6fi|)*)-V={fsS4Q`LtLJI$16j&XA{8 zp;7}<D^tr<AqHs(f~WQwp=tuc848_1Q$^s*mn_kS<@G@W^vU_T;8psdk#_LiWQnj_ z&GL&Bic<?qK_k__7?nYd0B|!I<o2RlpghC{UdRE~SY!Zd8i0=_0bN$0$qc%2x~TXT zWAQDfV#o+DB(T7-3{vtE6i(pgF%ziIz`+FCLe2%+y1^4uuB{QH7gMgSsijgi4V;xU z>;r5-<6L&pak{bEnhF|VQBdzu7bI1dT7)SBmMy3R$%7ZbV^;xI1y+-jSYoHA4JkQ6 zq9Ckk54Q-)gi@f`166`x3<?tP#4hMaSCq{aQs9YP#weB)Ht;?<R_Gb6Y$?*<ql*}$ z*dYfOMRBCafDbNWjN(k?TELwmxR5albgYqVicpGh3nS=Yqg37$krYwzsdfCRyeV=i zVkzQa8G%&Z6!{d16iF~o5ZusFC<3LeDr0}h@M%#hbQS_Mb^*GPFQqKCs3a3~T`pv# z6};d#AFLQ0Q+}WWSirsmHN!xO7M|%!7(hLYVj<9#!=OfJ6KDf6Lp*ptZai}d3+NIj z@BzT!rWxpvqZ-y4hIn>prmGV6gj{9>9b5rd|C$`P*nIt6LVa9|K>dGk9)sVD1B&@u ztl+b!Zn1(gW^s`Ss8v1%RFJSi_SS+oQDuWtVJ?V(%Y!`wA;4)5w3MHdlYyZaRB(fK zQgJb|fzF`^?WGcS%_}LY49L&SD}gUBhv!>RNeeG~KyFL{9e4xUtj-8J#Rt?m%VH|h z0v#`q!VJ1NFN<j*qd0>(16YQo$fbr6lo-G=EDIUMATpqPt=Rmk*i}I*3RR1LF<ODk zq$*a0Xw~A_UyM4Mtl+RHLU;{Se1iQCn<mcyc^F)Vf(fuU7cej|2!Xr_ZZ9%|Zs`II zzKMX&m_+tuaY<2pJlu~cEg_K36vh$;P~9O0s!o~wszi`N2y~BCs)lNjrY2(%=ng*Y z2l^CEW?*2D0=WbffDDXPsDTVhm+|o-@M<5Fl|Z5F4;pwf0WDf)EaItQD(0zSh8*Lb z!dL=cSJ%tT$WX&rqyyUg2RcoqkC73y8JcAw$fYb*9`Jk{1R9nv0`+OYL$jc@=S7ga zlo5W>0Zke}E;$EH;boRU>NHRZP~{bnSd^Fxs>;F5Akcs+_+*h3P>xDYEJ;n#Q&4aQ zjRfjJC%M35Tza7Gq?tvju)`8lb1L<U>_G{Z@fKHcNn&z#4rq^*CTkIBjJPNVl%9J* zeJLLh@g1ZPdTupXz#3HGvSpVi7Nuhpr=XMAWI-VeE>2lMr#CP$F)?z0CVUyI_z~U& zpYjHeY*3yCRaD@74Z6V;6xCUbDU9iipoNRQ%(aY_0-$ba2}=#=@I1za%;2^cTQ*lw z03$;!6X=q=67~`fP-y@<tUjC}g(ZchmZ^>jer+3MO@a$jWI!fKL4#eOfzwKb0#I&) zObvs^yC4Hn;1C37bVNizc2|Q^C}{H~Xk8Cz*zy)DI2b|eJ-}UkP&T>63BIrwwBYp? zTTyCCX>uxfaX}HdWB?BVd;$eBIMFggiVsk)>=tusMKYwQKx8CPOz40D7Zg+sETGfE z1Q-QSvk^4j;R~Zd2^dsrf<qP*eV_v&io`%CnG}nG#!G7$K;teTKDanw08OQUn<t>n zJ4_(epmhYbEG29u>?JH&95pP>OrQgEz$GZNUzHl<5&&ot19cEGOTcISLsnVAmOp7S zLdpqFFa=pi1{zN<Vg#kOXiyk{yayiig3RUq0Hr(VR!j+yB1sVO3#1Z$TqPugz@-ex zZ)WhoVdP=tV&?;`!W2SEb5KWC#l{qCf$CXMVQ#0VZLb+qtYr%ogT%UBbWFKktTsqO z!wM<`N(3-*O?#*yXkln#v0Y5Go>ojOSX2cb_MkokJnTVLASg5;7b<~vYZS|+FoMpI zsbQ&M1jhk0=sH61v0tFOUqFKjjJ2R!WSAuxio9xAQ<x<|i+WiWGUhR*u!0U+s$orG zlVkwh6C=q`!(Ia#eFNQg%8>}Fav;lk;n%fdByrFZhrD!!gyN#)1js}&sEh%J7BnXm zgKuS2NXyU3$u9@pR}G#_%|)KZ1!)0=qJk}W;f@|8^sGROc=SNwr4S7cAVW}(uB0f@ zC>CK;NJgpx#8F@a!2939b4%b#7+kJF<0}QSL<p2o6B4XI#ug_efbu0gFDE2G>?w{- zNKgO`yMcPBsS5evHAIOyaCKFdVE=)uRR!?1@kyzmKBzj#3ARwjgDrqMyf{`}0d%Wy zVhK3i-eLhsf~&<MaJ~dr^`H!^$p#u|0(ENhia>|XfSV4tIKj&bQZkcEZt;Rfwu@6C zN2V1QfvS8>4)77Ix0s8Ik|8+)H1bvi+FJ}-B>`<&fJ+LnWncoF*g=b@eL#sFT+DKV zidoPZ+#HO2j8cqM0tip)fon#1l?EzjLDd?#Gyu(|)G!uvfX8$}yI`1V7{x*PpQ(l^ zi>XKnbTd*DBWQXG)MSTjrMSgdp~+g53d)2aH{4<coyJ=X_AEGnG$E(T-r@#FdvQES zx@am$IoR=F0_=k-CI*HCkPkprI|CEwA`Hmxx+)1I*Q10P%77fGTm$<8G_(qtEQYoM z!Fef@p_Zk>4!ko8v`@$goU52?Ks)c5KohoEEa1cTJV3WV)iBnuWwA6fH!;?Lrr+4I zSZo*y6(9q3n#@&F(2SG^O|6hx0vxebLa^o|m<vw0RiZAX1v#0Z+89}bCTmd^sBHvl ztwAnP1BD;BJ*CMGP6kEppn8=R(uV;xCvUNUMm>rQK|}pasp!*cpxM%*;#A1Ol}u1b zg4b6ugI3pqww?1Zf_gA~j8$St;R#L+5H0Xh3RFUYFgP?pgA<_8EMaVBf}D%AkfD|_ zkE4VcH0xK(n8{GfToD8wd-sZAs%5EVg-)uw)UX!Y6snc5K+Zw{-JAtF;IM|JhB=$9 zD6WJhg&9<HG=YvY1cfqd4bwu<G54UbRttxmg}_p!2n}n6+{6OVL=>caKnn3<zbaL* ze;`FvF+3B4DqzrxjXVW#R1{Z<Aff>*0*)L__9Ae{Q5BRT!L>*chy{)maJR7;G<wVi zj*nX`;B~r?n8-~mC<aGRQ3EIz!RZ)GfD$ukpByMEauW;6KoJ2xWQduIkqbQ844Pa9 ztpbOPz=IDl#Av$4=O%(yn}JOP5q_GCA(~8nexMEipz}5SG=(5-4snokK^rZKBta}t z529!Rhy`le7J*t{Mc`@_R2xF>o1PA;H7h`l2A{<YPIaKnR|N8EQ5#4CWFw?F1G7M0 z0{7V1K%M~&+JJVZa&dBSa4>W6b8vC-vM{o7FfsB7^KddT^6)S*!rO76b~QX_f@TD3 z7+~cKc*q=7x-f#eC6Wx#eSTJ;0nP<1HH;|?DNLYA%M=z+85GP=18O|8LheTdk8fA8 z<ffR~YBGY4v)5!T0@+gp^3E-e(xM!2$}R%+`fqWS7Uh5jg^G$(HJOUoKx49?W1)&u zQ_wtlOC-K1H8;O3H9j}RG(N2;F&#Ag&;{}}xKv^Ul}exy0SU&UF67~6P<8<orQj^% z0ACdVnH;YHFV6(8S!Zfy1g#+fRrU**K^MHmFxRqxGEE6f4eJ8dg$&J%1$NL2%3Hvd z6m(r*9%%b1c)2Mk7l4ZdNV_x<u{9esA`e>X2Rii`tQS;2mVs`B1nB{B!cvPs>tPkr zKzm?yK=%YgJKj2=nFK%3SvUD58L35xE1BUD32NJdd<dTO1l3hF44~5_AzL=VtE8(q zpjTyE!Nv$dfv?F3F0ar7nm@A`zQYXUn;D=m1|=2-&^8&UL68OVAa5bo1EA>x$9+*A z6X>>ewj$8LVvz|b1uKHeNKR1251DTR-J}j42hwDNWY}(y0$!L!ASV<<9C{R#dHO+l z1f2H41SkXC5`sGz)V>FAr<@FOHMs2!UIz#sjqL-a3-H(klmIyj#4PS&WMDuUfMJSa zNnwV-RMr&cRJJt8+Iq$)_Ee4(fAFvjXmEuSIxxeP%AEqfKBt*6iU)FiP84qnUkZN< zLlj?%K#E`sLli%FNQNOw05TjCB?umf0o`E?8iHYn5>Dk#kxG#U57daHa;M0o$b#9T zDRL?DEeug&soW_FDT-h*@l@^<r4(f_TOw65MI}WQ%$7<~OHprOh>}hTNYPBuYGI6$ zNzqQxX<>+xO$kiVOVMv(jFL++NHJ_-h>}k+N-=I>h*C%~Nil6<h*C^3OEGU@h*AQt zZ?#CVY~hGfPE|=&O|fcbn!s4B60MxdkrI?*oniwXFj7mgO|ffXh*D3nPjP5rh|)+2 zPH{|eYGI7hOmR+eX<>-cN(o7EO>t{sjM7eVPw{ABh|)>%Oz~=Ah|*2*PVs4Bh|){t zPVr6g1G`<noq>fR${?6QGZeggrph$DD6s%E-<FsRzWOS^NTDFVBsH%jGcgCTAO=$J zl<R|bS%7K*#5l5FGN@G#ieL~8O2Xhm05UCD!(6}tT7go-5YJe{lERS9S)@?H1ez4A zVTcE{K0t>duz|*-K=TLjY@kJ9@$5BB1$HGIH4O2b;64?T-!1mgyzIRE@;pthqFhk= z6a%GCP@2BQ0ZWxd)*vzPBnPO3E7AjHgBDN=f-@d=Qi3K2q(cc-0A8OBHV9NbA!!He z1gCp20ZRPfqraDcQaiYP$pWgvAY)UY@u@0N(B>3a#||+%1!`D=0tR#zC@2?rgT_tj zK&2x?I%5i>2ty1D=mgnX_F9e-25@!21U^WUsg|>b6V&x70iAywSHc3}Nix(jl(2$2 z^tD_yTt#s;TnpGhg8`tCtA#8Gvq0N!YnaoRYFKMP0m_lWHixB#Wja$I;{tZ@2n@Sl z5oiGuxUF@Ixh%El7AtrVw#XCI!(=JK5-6G+ND~D-pr8eByb(k>l>u}o<1NrsL%g4( zuPeB9aEm{_C>1m;1B)h2Zg5)yTnj<g(1YUv)bz$?ZxKJpE^z+=92sB&93!Ar_ZvYm z0@`!Tz$C;dzz8}>AGE@pg;9hFwC$iu3MF2^#TIO*HcG(`D%`=T78GOPdKNY-i*;{J z(KIFohC?8`LCKwgu}TKT9yA}L*aWI5!8U<B4C?)Y#u-2dPnIy(Fl4bbgN7|x3uID2 zG+Tj63S$~*aU>I@*4Jde#Rsm|Q(&P9N#$msECH&IA)yM-2sj4)oERAxj)GhduG5)8 zbvkHoIS1%|FQhXe^fD5QGm>))P}~plFxdT|QXeuV1zKMQYL+qGVgczW0vV6p=35-` zpbNt?;^QxXtOuC|I{6GW@SrN-Jv5Li5C+={axpm67_%6%LG2+>TM%L+^vFU_P$>XT zC13)SRBo}w$LEy9$6rRWR2a=tkUSAqf<}aiwlXz7{u(|jQ{&@_uo5&%N350UCGqh$ z@mL9xC&Eh5kO|RNrpCwL!Dl79FF}nca9n~)T~N;olmnWXiUmNuZct9BVa#FzpYzM) z=cdUF>7Ia&ZY3s~Qw!tc?}J<e%4ZCWJWMQ%Rp?O-QiDAZKxrCOcxE&4K++bt)dm~M z$C0w~Qsd*Ff~*83QqT}OTFL^+!?O@b4XBy~2LR~aGqm$)wII{xpkM%%|16+eC_r-* zjL6gGEVo$Vvr{XJz=NgWvKmwt!<-2&48Un0On@=~c=_HNkQ+fhWMG1v_A0<wC4l1A z?9@uQLqR1XdQ5??@MS6%D*=^FOrVk~9#m$5&URq(yTuO~nShr}u**ypL1hyts*4ta zdXm`7)9FkM3|~O*14kPZ7b6c-l{AXmP>VgdGePAwNDnwXBf#^uS&UgswTzJB6f}$o z+7(qS18PWs5?Zkuh*iS6fDJTX3#tznaDeL2g`izUpo^=Sv$)e3N_ar?Dt(M4yrA>d zK{_;9{1WY8i%URbd?2h|T~L${+5iDwjajRpQ4MWR*J^^-&n2aTCiEaqR{(91P{>J5 zPfV_a99Ri50fh7N^ArMH0~Ab53{WMYhUqCp=9enuCRQqd7NaZVr=%z(rDi0SWr8;^ zq$m`FZae`mSVoM;gUt2J0}uRVCYORPrphc)fSrE{(f~R$s8|7XO&;j-wmby`Jp(-j z&k}IA38Wc>Gm909QXx~&DWKgP`3kw2=|zbpsi2J{P#1$&$$)N;%7N^Y0O<o^sN12t z6+t2(Tr>$(I)fHcYVs9<MrR-=AIO8!2zVF*ltzkzL5e~^1b77EBuEx94+A=%@D@v1 zVo`CCD5SYE3Dn4A@(H`enOPhU31P^Ygy0MSCP29WcFrS21*``B4N7((r+}s#!NZ0e zp#7sP>_SXciYQ4Cyhi|PK1??}A%gM>JY$2#8qhMf8zf_cmcWB&6<9#K7(t5&z~^u~ zrGU;Y0&SsS$YK!#P3kd$=567bp2@FD!xyxdGcR319omVtQdh`G1>JcF8u!)DFH%q~ z2Ct0MWGk8gYBPaL2T*717BBdk1X#=c7U*=%c+eHD;6X~*@oeBM8VL$?aDagcP^f`p zNR*3#p%~oqg_j+mc9sBoivb$z@K6DjBJfZ#VqjoE3l(^A2iormD)1J9&ys_zc?H$; z;B{$r@Kost9|o%^DM|z-L(sGoXrv3&!`FZuc%Z2O9VG{iT|ky}fzlpm?I39Q5M>V_ zXuTC^RV65&f(8gc%j*=tBejUUq{(tiEFL)}#K)(k7Jvq*z$Nf4K2TS<B((@SkbR3U z9<q-Est9LO2r91t3R`fw%myi!#Te216Ht}#U<LIhK!ZKtQm>4GfuW+HgaJI^&j6Z= za$$ ^l+f$mJ8qcUrmYoPmsz>AYXgOsfKZlE!jX2t@y64n~lW=0+c&@gaOKsrM$ zGi0?&K@=!i)__hnX96uUUcdo4rnOK2bmt0a2)t?uJZhlhG@uA70EK3L8YCRS^Rg+a z1*v%{sd>qnso?AFiZVfinQ3s%sd;6YMfrK42vf*SEXqzTf?VAM*@dG3x+ps_4|HTH z!Wg(-&?OSNpglYwTS0LMH2@KTe&F#DO-{&E8Yu9Jz{`nxK-r`eRJwq|un2UgWD$7f zG3b<fP4-(%DY->PpusXu(6VxHswe`_wt<I8j6pIyX^ELR#qkg;!L0=d0nRxqnHU&! zK(PxNo@8JbVFb-c2rz=$+FaoAeI6z;MznekH7&to92DE|dJZ%=3qG;l4t#LGSuInA z0jMbsIlR9aG`uet16qR4QUh9R#SD%+(9#bU&~i^khC;b;@I9(Epw=w-Ab%ccjsYLo zU&RfHE-*)vwFo>QybKgp@W3g`0hPSasmL`TDe$xpD6k+Q1TH?n1UMvCF)=VWfkFbD z&cWdz!6=8}ca(es4oG-A4HN*Ju-hj<)1;u%p_U1hSZkO;9$&x&UNXl7+GbYa0UnQc zsAZ`XgUFVE#@eBW^M^AODnWPmCqPSO))Z#Ynt9Mt5zt(DBtxN61VbU{xPDOUhNa5E zC$kuQ0uXe)0w|#tLwB5kX2T#$7C_r(i}FFEiV5JvQk(#uvnwr5O@Yi6RmrOsgZE12 z<tr4ICTBo$h(cOwVo7OHs)A~fCR@>JP-ub@U=es3H#kv(S4o0AtqBcs&}?QADBN$c zq@)%ULpsUe;06=mFb7Q|dxF9o)YWHT0^OMnI+K`*QH+s~k%>`)39XcYB>{MlgQ_$T z2Cb$lhICgKfbL0SEK;eE03D|fDp|lQ+L&q}+nvQghdP6bY|zq9(1Ft6gK=Rs3^<8^ z=5D|-3n9QR1*NTUkV`=+9CW_F03%w@9i;+ugHP0eT7Mu6E(bx=UZBGmvN?+QK%*(( zl|7(6iQvO}K<iOJqS+ipVUV^VXv!Y6LT>>p=y*Nw{Zh;|%q0w2Y}sr@HYMz!g;I<R zg*KpFl;HEB?4WD*!O@%vIX4lsO9FX`R-OX*0Ko(Wjg(aIP1&}veL<R_t)ZZ%OqCdD zYPA@&Ejb>#z8#X&I3Oz;L5p*XSV0vrXemCVM-K`i$j(EMFJVVhgH?izyv1CQoel|5 zc>LeuNK7utEK4j&jR6HMr1IuqWMkw5Z|f5PEvZ5swt}gL7doKM3Osm0M-M<29Az;! zGlGhnEN~wni@89mge8qx4Af0w$YL!r0nKKB)}%m}SAhx{<|+s1zN&K2mSBu(SiM*Q za@>4T3V7E(xFG`yCWYb*@G|M7)G993VqMi@-GWNhV(^h$nrua&lRVG|jr>3%2O0&0 z^@oZ<0^nc)6W|mFy5lPy6f8WT;W;MoCJ<&&(4gfB&|$kEXTXC5)Sv<732=%7O$338 zA<$mj8qiuZ22cSK%mC^jfd)mu{RSq;`Y{dFVom7W3!(K`MIeVkvH}|;A9^;82OUyg zgtROS6ie_n7HI0FQUDY?DU2x$&CKAvMG`CwC7?Zl8j#X1g`t)a+QMQiFaVuX0xJEo zm_QePftQl8_<<XJRf5r_kWp9IaeJ{<tg6MJD*>4yOLjmN5jgx|VJ!oyOu@knCct40 znvAOec?lfW&<!`B)wfk5$c-w!_;|>2H;{k8u>!rl930eg;KgPO7(ku2BB2sS(A;Yi z=r{<5EYLhGXj2VSm7_~4sBI70J(827P?`toyrk!Wt~*sIC{4=AOjZD`RRHDORB)?A z57s1xAL?5Ks@XMJz_VuH#vR0;6G1&!==f4OsC)+d4orZ&c#At8R6v0YkB@Hvc@-Rc zpo0+@t0d4onGRXKj1+;OGzHQCN>|VmFhFx<pi-)tX#oppP7Ktx1Min*$YKSFfOgt8 zGdeMVQkf<*>S<n}91E&7ib0W4!w@S1Y6>o3NMTsWSd2K!3zRFFz}^LwOW=tr$kB5} zSUd<mz^e=7F_7Ub3`~qw>S*3d$t;SGN6b<o4)S7yw7LX9ttHmt(t^|?@U+7%_V{?P zo+5DILWTu28H>OJJ@Ak%+QP)Z&<3&?l)@RniH8Zj(*ZLGq!y)W0JRywL+;?z!vH#l z8I*3I+eR1{GS)DqG1oBnfx?0jbh<QXNEy7F0BNinbj*t;<YIWp4h6(;HQ1S80+b5C z$B<11xfK+dpamQv=+zi_02(x%hf=115<DpG!3iC-ZXT3<v%q)JWwA6f6)AxSgF!b| zLf5k938a9Qp&^NsfX|Tz?Ss)|uCj*~wTTJ|2}tdggalAezeEAtRt9B&jLc$`zK}v{ zMPhPEPGuFFYO$@YYB6Ztt1XD3$pIOJ1C7!k_1a}YnH@a*1Yi9EEeCF~fLFPIg9c21 z!$*mcfngRXe86$ZB)}-dB!E85lUN)NZHIuGSSYaxN_yZR0_|W2O}^HE?y3Tx@(Vu1 zKn=Qbg(;0GjS+IgX$>>zcm!}q#TFVUpbkO;DEJeQ*P?)Wj|t#K5ecA);G)FL;#395 zdClPCk^G=*a3E_e6jX~8K)sGM(2gI_CR0#AfEO)-mK(roXVBsm@C-{)6K0W71iH+1 zF(NQP`|pJqt7K7f6?obNJn<F}Uhsj^G6Mx7I5<EiRf6suWT<5dXUNlGffV*;kis6c zM6`xs0Sl<$tYKKl!~)uc!w?U>%@0&nXLA<$)PS#P%Vb!{1UfSgBf!9JfchP@4h7Ve zh6WdS;v5vHpri4iL7JObP$dA?193OFdE*CK4;GKqZw4=@fGoEFH*Y}AU072Q6n3}R zpo+mM2uy&JQ6K{Y!zxh7L7Ft6c^=TsRZ>i#)05EJji6f{AP&h*EP$sbP-X*RaPWal zfuyE|jG%r5I1@2e*&wAC@bVhS3b}mn8hmh*9~uDKkkkYYhlB*b{JhkJ1Wl$QkSoD0 zcw{d@k^|T)U;^wP&>h*^K>h)h0}SXH0^tMDtqbr4U!Z;zJOvmqGBDII6@YGz1jQ~> zu@Gn|y@U}wQwY0~k7XfaEh}iGvxNcFIcjFCWvkd!!V21p>B10O62k<Vg{<MI0bM5? zQ^Q;o7Qj%r31m*8T@43#x27HFLg5njY^EZ+8s_4*8Wzy(BIGu-Y__5{klGr?5{@k9 zY>uKCu+!^nK=)y?gKqI=WT;_Vz*WNzI*uBALz*4vHZ-XE6L9s+MYlkDQdl5*^0;ak z7jT0vrDFtdUaoMe6scibz*ECg!=Az_&ajZFmNT3o57flr1>bln21)k;43P|luOb*~ z*lIX!LEFzjBxfyq;VWo+o-OeS69WUZNe{j(1vWDXYSV-EID!sThmSINrYS)0J+TEJ z<_B-!qaD1XtKgXizcUDA66`pdOwed-NrpmVUS)YkYEi0=LQ1{@^lW9sPz7k9N>{-( zr#Kb$JRb!Gu)&!n>Y#xU(8ey%sGkC8^s6AT2z01T3hZDvkfl)PqYfv7%+Aa!PAw`? z$SN%^QAh+0AA(9gQ1*qGg6a^ErC_HhB&MW*2HQXiQ}a?ldO&;S5UP<v2Xqr7s@uUX zM-E(AkU(7t4-y3pP^k(!033Cnj{>Mn&d5y9NG(z*D9X$)$}Fh_)n%YHLB*gkZjk>$ zH((T_>l=hYj2S236<46aE6@;EPJTJ)P7s(cL4{XlD%vPIYP@8Yz@jFtC?9f8F>2&s zHV?sTm}D3jKxh0w8;C_BpsBcK#saY#lmm)Ujxxb{fWsA7`NhUirG-+5K@wbiejZZW z5Hwy3KG6hx03Y~>3{5^rM;Elk6RGh9IwkEEXKG$)ZYpTrp$NP(qY_lzg39h&V#yh) z$=R^6`1s`fytJIm<dP!LF5n{Y@d4hTsu$Evf!)Fi>NDSB&dE;(-xPI=B`+sG`4&r3 zN@me5);v(SLHr2X@qLRa4}FO#xL>{t<XO;)1O^e%t&}X_iU)MNDriWYg@uh#h#4}} z2da>G7}>!602W3*CN4%6X7H`7i~@`tOgu~+OjTmo0}I~Y1T|qn%}J1Vi`RfUL7=NU z8MB#+_&~i&(D_fGJ&B-`pFk&{KsJMbPKm0h1B)|*F9j$7t+y*-%VN)FFE*)R2Hh$J zqDweHw`+rLs!Rc|GbuDF;RLCwVU}b_VFh;|S!!5{CO~%aFW>@|!o?;vEZ`fCSr;-E zO(--e;Z9+zVXgshLIDi|fJRk7cU^*9r^)Vji>nxZzB#Uek1F1h{DOG!P7&~Zq0F~< zQErzg+7DW)#!?JAe6)p;fuYLN7qTi|wOFA%u~-3CoIu85Qd1!70#%D4YvdvK+CygI z5>ue_Snxp^9`MvC_>Pex&>;~;;HF3gD20L72!X;KGVlUESpgIS;LhPK-pu0S(p2!2 zP-b2_bX@Khb6#;l(Jqj4*>m$#K+VisOlf&&BQr%inHU)Uff5nu3T_5QE+!Tx&~S_Z zqYxwLKnf5RViaQJVFV=>CdMjdlthw@HO<3Q45&8=ZyA90XhGVBj11unc`7WBwxJ%R zjs$IX0rxT)#Th{H2D(flf&siik;Sh{AT$p&9$NygY(OnOw-8Mh@W4P3C_@z;0%fg< zpmAVG=MCMLE{qHeBHRoN#jt)qX!SK{s~cLE7<9E9`n(aStq<}9xc3Gc%mGbARH)Q2 zftFmlFvLoLCo~vqU`I+ZH8X=IY76;5O^OAe1AiE@z#^bEHE9erjNm>VOO=CjegUZJ zK<oMFfDV`_F3Bt@1zi>h+Wr74ijy-E^U_mO6tYt*%kzs;6hOPXs%(&Fd|~4v3I*`% z0^qk-BN_pS(?$Kj_g84L7J=4}LZ%wPDGJmD2KRhneFxBJE99JWEWL5?CDeJTGN7;p zwF5z2O+H2m(C%Cz)RY3cyb&c~fSQ<~Bn_U+1C5urfQPL>!wH~9KWa?@Y9fPc3eW&D z?69jE#v&G!8Uh^c@RKY-`|iL^TQC7`-+~UiQUkdaWH}oH+Q<Q9pd4G}pvedx3&%cv z2Hsks0yC9?32l)F#8l9tBu1$F{M^7iKTXi05<{#@$CrZ=G<f(BT*H7@l7m->vw|c* zOTLQ0H-duJHx<nUiGj|dESe2s%>fZ}LBu=|F&{*L7h-_>%u7LB8Bn1D9^D6DBnp}w zDgw=mK=ylq%bkrNb)d0H@V-pQGWJa%G0@Nk_#C-gZ290G2zamobX+k5xF-qeZh(3c z;2H{C!hr66XDB)b(hiy~xWyYE55AQsIW;FIJ{}w_U;;Mi0*)-udA18cGvc7N6yW-d z8MMHWhl`1kM}UKwhns^L4%s-^c{q63Iiz^Fd3bolIM})PI9R#3Ik-94I5;@icsO~O zKsz0I*f=;j*tvK(Sh!p`#5g!`-F*j2Wr)?mpwX@<W=L6dOV~9%-7_x@d~`Kzl_fk~ zgOU}fya1<b&`1wx_+$ZijS6gzy-2DCG_TAIS=pBeIwt_$un&M-ZU;JEr?@0BCnq%p ze3C|HF{m)eDOS)()l1g{-7`{932KHGCubH^Y9bnOkXuJfi$P}-<|*Xoq$q%oErS+l zkaI1I^WnCYWPpyDgUW(TO#)4Ig3iZGPX!Il<fVfgP@a(rIkXbgWKYh|1MLQfEWm&b z9zoruqhP3KXsBnPmy%j$plxJqWSN=>TAcy64@o*6Dy^xf5R#EvjCK|-WN`?n{hgEw z*9~2{0=qI2E}oKKo>yE_l$w|e3M=F?2iz+`4FP1|CuT#A)Bw-k7nh`h)*YuPloVBh zny{b{0QE3XLkC=&!)*r1!$)mFfdT3QrRJo8Z?8&C1b0n9YCuw;>KD;P(PSwCErx(p z@ZhWtS|tG+u;R*vFI)m=3J3wt5}=H)1uAJk6%qpvX#SRsu}T?Bk^~)Q2OhJ5`oK?< z1-+mF83r*MTtI>euq~%RL(CvsK*^bdu?WNmO}v3d!oe6+8iPjni$R-65cwpEIfW^T zB^9)uiFqMp-8@SQD|n?hXDUYu_+W!(#waf63VQAou3!dD?pxrYcl0b(6$TDx;@5+N zl_S=K>nI@ZWKt+Dsmw`*1ph4#U)K;v7sn9CDrt@A7!93R@GjDr6g@5QMpKPwofyqn zO_UrB3T$wW2KgCn)rb|O`BDSESv!jv((uh<1s$;kx=wE)D6fO-HSqcw(C98xl>~Gj zRbGlha$<5uD*T#5KTVEXobjLrCuo2LGUyLFZnX%MMsBgD<|bz5fG<%mPA$5{1~#SW z76&+I6qgi1(+{{_M~YWal-?46t%!pe?gENmaBGMeveJWxQHZfh6_kI_qe2f|FFbHi z+IKpbOKQ{*fwK_2dJr^21r7+vl15GDTXNvlEa+CEt!fdC2X)a(OHx6LUEqs1aMZ@2 zYRwPiJ4ky3;yW(rcqY0<dLR=)%V*$z0xih^^>jdKym%34eLQ12Lni1nT5wdRGjuXk zsDW1REnoumbPANxLFcLn)iQxjdIX)l23^;n63zhLRl%IX(gHeflofRDE$EELTF`bX zM$i^3$gQ~*Hc-=87cv$UfKAh=Wi4T=VFj%S1dWZAaDY#7V+HB1VUb{HW&~}Dv|%VL z0yQy%88q3dw1Ys4<G`ntVVlrQL0a>o=U2rG9f~j31;sbq>!9oo@;dlLanQ(ig+>R+ zbKnDJvKWdKK-WQnHW}40WHK&fEMkKm9>WHmYG?8TFHzBCDgv!XDKY_Fmcs-V0&g<a zWJFqz0Zx^CMX80w@oD+c<x26OSOfJiLG$inj8#q`*I~vOwzPm~w4oYV#TQVN54t0> zSl1O)&}(uQT>-U1E`$3;paIRqoSY)?5(m&Sl3Sc<Mfp{!dBv$EkR>?aMSnaXkFY~_ zYk(FyfPGVR4P*oxXh~vz9@vw&*oz^{uE3cO=39_Qi>@*;Foc182iYIM$Hc-U#wf(Z z!wNd;QH+s?QHBXJRzaL^{WN*d3v=*>Lr^h+*jIRq#Wm115YkQr`4`-T1v>@oKqLa} z#xqO|3^pJ)f=UGr7SKw3E+!r>9*!cAj3zVW$SLT(DxmTS`MMQ&^#E%9fXYkou^e&W z>{H8B!qCi6%Ur2cAp;&HU|PtS#asg#n$-XuAZ^Z2%LM8zg)`)dK-a=JKnf1X%rN8- z=oBW9T5*O<#u`S@_7UiH)69P0F`J?SP@TnI1nR{?mM&ZcHF2+j2yhP(zGhRCr3iFH zMiIDM1G>MsNEf6CT>F6uaA1Hsl%=4+01e4AFtRYRF)}fOwsnBEL4&)Sa36zeL{QEF zRSv}>C>OS%G#o{tnGQ6W1TMP4vpMk02P#WJWe&Ka0YyOy;{s5{0X-?quL!(Sl?i<A z6xatiia*d4cQeT4AU82ER>@+u7B<6;rC9(n04Z%C!sHGU149$cWDdq65FhS*kkdhH zqCmk?47&0Vv<MKiaJiYWma(D$G|V5HQOlIVSOYq#)S!k56rZ4VQVSVD`$}t>YM7vV zP76SCDJ&pS(DZUGQ>8!+6XYTxP)dQO642Qqd5}~B87hFBW(vM;LI`@06>C)&<RB~b zxkpI91#-X(_+~ZG6k%psW-|DkJW!uIp}3@|7<%vmgbm-z3_JD;Jj;@(paHu*QWtV* zq$Xl>C}{U)YJM7|;Zen;pzQaHG3MpJ|NsAMauk6!MMAckF9)SR&=GFnJ(1uolec(- zOY#dmOF$!ynfZC(E&ZCzMd_fT3%tb{+tMXa0oD$RA8;YV#=`{K;Vi_&#V7!ts|KZ9 zQ0#!xD;R^K48$k~&Dz0Qao{?OF@>px1JvV5VQFEAVo3p=navQzn!=vK(ZUeLmcp6B z)xr?P4nCNQA&MiFGle&W58Te<0`KVK4rb8g2Rj-*O$aI%Kov5`(&7`Krh*7Gg)l*m zU;_^d8L=>wFlVu3v1W4>xxr74VS~giXf+&Y!UQz_f;c&*h9L{QJFf&Z?a0y02pV3j zVP3$!kbw!*<lw1ci06e)H8EuIfkqc<7~=U$1WE);glZVFgh7i`YZ&5%YZ$V4YZ$Wl zN<_e-pgx;u(FV{hE?J_@pff!f(^zU4;>AkDYZ$V`z&j2kK+{Z`ELC<c{tABnAqvip zK0XQ|9-hGpp?)s@&Y`}pej%<d3cju(9{w)Y3Z=!V3P_m|a`=OWrXuP{2PmMxBORcH zn&6QR0nnle@V(58X-vpRdovZeg4Pp(I`hy$kD{%h6avn&U;<p0fd)NRfYJr1L||j6 z(m-}Ze0*kJW(mr23HXq>rex7(ka^%Kb?^`bXl;6tIB59<>}&-jv%m#H5$LQO@Z91p z?$SJP?+euTf$Wq7Z4D^`&(ed&BW`g*vt4RYQ60#h91sDj{~>iRXr!R%21pFloB$m! zU!38bTTnCuRPhSMBiRhu$psy-x+R1(YY$q-lbM$ez9tB4Gi-zb5j-G|%>xAwC>%li zQA8L;80EnCn+h=rfp5bBt&){ssuDr660xxo6sn+X1foHy8(e^cvLI*@19VbDJ}5;o z!FLid`oT65fy4DNsN#aI=fSe8rwBBLvkBxpP{Lqf;$o~4LUjfew-6P9#)@`;ECYFl z0mCZr_93to0|ThQVgR`b>|fCKA((%`?L^R`5T<PAA}LTFsbS1w1}}kR$zlaf^QSQP zf>uef__>8>GT!1YC`yGMs$8te23g(#8vB6^hl66J=n*K&IiR;_6vH|?potNrnhKoQ z|1vNz><0OO3lt}epgU<<nAljWB!VEPdx2_Sy?D^{4ET^$w53m=N*L@PP%4CUR=`7b zMWFdv92G8T^zAsvMsUC|qNftjHbgXA;Hd;s&6j}oSTKTDyD|AyAvY7CMFdeNr=7y> z1jx~8@TwZ*P7nrr6g2t^aX<_ssGJFAfOr^GnP@T<flrLXc0vs3Xos^PD?v#BoGb;A zLm1pA#cZX5@)|frgHu`&D6$}<m*4|3z+;ghgNsgray>YUf(Tfi1xGL_)64}~401UK zBaa9N8wWE74`?J1?n6*C!hHzMiVWH8MM5<UB@Ahd;tbFOEEuc2z{3X6nRiID0DkH! z^cJSvqI~f2w_uf^xrh9m6kYI$f&zF96E-8N$yjs(l$RNAu|vht(&jC`_{5y@#LD7$ zh((t{z5pdO(D9{Qj72X&hZTUF4NAG7U<I|K!I1=6hy`jpgHC!$VJrciNyXUA3?5Tt zs*nL)92+YFuK5_U*@_fu7(mlz!QgXpK&>N9<|-rT8WQk{j)?`Jo9Cg|MnV>l<R>M7 zN4FFbic�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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a641f6eca0b53dc200961106df9e6848b0aa3e8c GIT binary patch literal 651 zcmZ?b<>g{vU|`Vf?~E~GVqka-;=nL70|SEt0|P^G0s{j>3PTEG4nq`#W{hG4^O>TU zQW#R0a+q^jqF5LiQaDmrQdnCUqgYc}ve*iIQrJ?Nve;P|m>IGe^F317vl;SOm>3ut zqBv4Hio#M^^H@?DvN)qSQy7C8G&x^_?Df-Ryv1CcS>cw<1mZF<Fo0YEa-%cIB_0e6 z43&H(3=0@*7#1=zGK4eanXoXFFlBQUIWaQSGBGk#iPbO`8PqUkF_$oBv1BtB88tD4 zgIvu}%T&h{!4S!i#}vVk!Vt`$$>^uadW$K)_!dWQVs>guW>N7icK=}4qN4nwTdb)? zMS1zR*j!yBJcC0tnQyTaB$i~{;z+H?EG~)9&%VW+T9Lexp@^G-f#FxBenC-YSz<}5 zepzCXep-G`N@`KDzLBxMv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn| zZf0I_Nn%cpu7yEvc1E^Q4oDD;<I7U>Qu2%R3$oMWi&Bg8ON)|Ii}edCjSZ9Ya|;qn z^a?6(@x;U29&c>O0SY2eSTQg%G4e4AFbXgh@q%KP=_M!>U$TJM%td?*3=Bp53=9k} z89@S!Zkk+0Ao(IT1_p*(%*B<(x3~*33-qA&7lC2|Y|bs_fJmcTJY}gx#hLke@tJvP z`M3D;Qd3ik;jSnG*#Qm}B!UNIE{9ESeoARhsvXGEVvrj+7&#a@n0T1Ec-R=Fm;kDR Bn<M}L literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from pip._vendor import six + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..a41f65d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py @@ -0,0 +1,127 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +from time import time + + +__version__ = '1.4' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + + def __init__(self, *args, **kwargs): + self.index = 0 + self.start_ts = time() + self.avg = 0 + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(time() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + self._xput.append(dt / n) + self.avg = sum(self._xput) / len(self._xput) + + def update(self): + pass + + def start(self): + pass + + def finish(self): + pass + + def next(self, n=1): + now = time() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + try: + for x in it: + yield x + self.next() + finally: + self.finish() + + +class Progress(Infinite): + def __init__(self, *args, **kwargs): + super(Progress, self).__init__(*args, **kwargs) + self.max = kwargs.get('max', 100) + + @property + def eta(self): + return int(ceil(self.avg * self.remaining)) + + @property + def eta_td(self): + return timedelta(seconds=self.eta) + + @property + def percent(self): + return self.progress * 100 + + @property + def progress(self): + return min(1, self.index / self.max) + + @property + def remaining(self): + return max(self.max - self.index, 0) + + def start(self): + self.update() + + def goto(self, index): + incr = index - self.index + self.next(incr) + + def iter(self, it): + try: + self.max = len(it) + except TypeError: + pass + + try: + for x in it: + yield x + self.next() + finally: + self.finish() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43e1792e3772140dd65b18566199cc3aa094f47f GIT binary patch literal 3919 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0a33560cea3328eb09fa52db5095c54a61ef48b GIT binary patch literal 2741 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 GzybhbVnvPs literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abd10b96f2e27ddbeb33884873eb7482e51f0875 GIT binary patch literal 1583 zcmZ?b<>g{vU|`Vf?~M7u%E0g##DQT}1_lNP1_p-WA_fMA6owSW9EM!RC`Lwx6s8pB z9Hw06DCS(2C>AiEC5JVaEsBki!JQ$6HHEE(A%!iKEtR>MC5qjhA%#7KqlF=bBb6<c zrI{s)!<`|8Gli>#A%zPn!s*VC!kxm?!jQs~%Gt~u#g)Pv%%I8l666w1##;iVd6~)i zDXH-}nI)-3i8;kD89{Dly2as{mzJ5AS(18-BcLchy(qP~Sd;M<S9nooNvdyVMP^<y z$OIT>g84^=fq@~FA&N1DA&M!5F^V~bDT*b9IfbQ#A&NDHHJCw@?H0RperaAwYSAr* zkYtc$ATvNT3j+g#Gbl_%7#J987#1*;FxD_+F*P$T1ceJjFoPzepC<Dy)^d;&ZZQ{^ z6y0LY%u7kF&}6*DQk<HTwvwTUmw|!dSD}7EQD#|UNveKXVv&AYeojhiQL(;}vA(gH znOV6-iKTgQUVMs$QLbf*rKyRrX}N)cfkAqKeu#cSW`S;IUU5lcPL8gHL2h<Nwowj9 z5RBu?Qu9*si}VYi!J(fF@rPbP<t?_-f|SIPR4I`2L1DqbSj7kRrXEDfPm}EyM|^x< zVs2`D{4K8d_}u)I(i{+*CqBNgG%*J%!=9U3T%4GmdW$<FGbJ@XxwNP_zo>|xfdS$< zun!>wA4rUyfq_8`WGfp30|N&m3nL3t5l9Ss>_}k5P6~4iLljF2OE7~b>n%>OlT-4` z^T>&rB2JKlKxzIKXHjZyVrE`uUb-e@5f4Zh6fsE72Kh%3<ZNhQ3BYZJ2N!FR07#=C zh!6r1pk#qNAVe7$800`Ef|3yjC>TH@*n@$HM9Laml9-&W$@z;>p_G|{f#K1#Mkw6` zrJJF23zTk!(rr+>9ZGi~!V+W<DCdJyxfufkLkU9-Ll$E*V=ZF|Qw?JZqXa_<a}7fl zOAVt4Lo;JDQ!P^s!va>2ni?ia26#ST@+$%vrO9@SIVUym7F$6^VsUEmE#}<Jyj#qf zc_p_vU}+Q_Cz{OQIJm{02UW<J35g1Dq=1tVC_Xenp$AGv42)ci5{y+m;2?m<2OD~P zfD(HV{zwsLU|>*%84FFFATg9^0p)#gSqO@6)UqR(L6i9wb3kUQCMzT~r*}i?DNuSM zl%5Ku`~5UousRg%R|Em}wE_bJgFeW4pj61gSOntxX>x;dXIg1VX;Er?d=W^hhy#@V zKnbe|6n(eYGg5O3Qj3a<K%oWBZbhKPRs`}I*bt=P1zQQS?G}d(B+J`@l5{aBSMV?j OF!C@9aR{*saRC6nkwyRj literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..056f93d89cf38ecc0c25376514a0fe2a58901cb1 GIT binary patch literal 3025 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7076ed842b304ed74ce32bfbd63e4b82e30b0b24 GIT binary patch literal 1500 zcmZ?b<>g{vU|`Vf?~Iwx%E0g##DQT}1_lNP1_p-WDh39I6owSW9EM!RC`Lwx6s8pB z9Hw06C}uF5C5I)KHHwvy!JQ$6HHEE(A%!iKHI=!UC5p|RA%#7KqlF=bBbBY0If~t# zA%!!AtA!zj3(V(mXGq~r;b~z=;Q{kG-5FANQ}|jKQux4pt`z=Y22FvNAQx#e-V!Ly z%S_HsNsZ6REJ-a&%qf1!2y#2)Ee_ATw9LHBl2lE`TU_BqnI);dnH8CN$sm0&%mnj| z0s{j>Dnk@w3PTiA3S$&=3R4tI3Ud@|3QG!W3qurJ3R^IPCi^Y+;DXG&ywsvw44N#z z7<GR!#{6Qe`NgOok_@sGWGcu+76t|eXHXcaFfcIGFk~^5FxD_+F*P%aG1M~FFf3pO z@oE?)85V-VjUkvplhIF;<rZsZUP@}kE#{omyjyGq8HvTI#kW|?K@Qhsy2VnQnv-^m zF>@tDkq`p|!>>a9f}+f_#FA9~vcw|&wEUcu)S_a2BV&DIGc&VtixNxo;=K423!_}i z6iZVRW7Bd20|SHf0{syEg3JQl%)H`~#GD*m3xnM3jBKMEkRTYxm!;;V<QM4|6y>KE zr4|?K7ehR(S5SG2t+XH|u_RR*<TH>L85ji^tN5THq6d-m(`3KJ5g(tIn420Oe~T+V zJ~uz5GzY}yiH|QVP0WGHu;->07bm8t7V$AKFx=wK$V^F%PcAJg&MztwVPJsx5$sV2 zAq)~@V_;wq16j_&z`(%4$O3{)MIcd>I0ZQkoI)i~;uMrVQ&`ejqL@=ygBdj0ZgB-< zra~QG%FMvP@M!vWD7_6zZ-vrZ{4`mLL_tmfSzja$Vu9QZaT_Q)AS|#er5G3(K&h!1 zloB`?i$Hv`+{f*kpPz^7z===?O@h)Bp!8%?90-a(P{M>c5X47uASgt^0Vsnd08^M# zn9|wcfynKXnTHyReY+rz>e~&a_dw~rq&N~}wFW4zp`i%kqc{?j2EdL4g*77QLSh+I z;(*GSbdD(I6wY7<O|Dx!0htx4IVi!ocpt=Ni=pwpcs-OqA3`tO51|)9>BUeVEhfn) zvJ4Ci+DJYD@%=QpL3tysw4}5sH9o!w<jEp-P_hCg-dpS$sW}CyMa4y+!WNvs!KtVS s6jMc@kSGEf0!eeIsqYqt4J5<a34*KyB~l(n9!4H!Aua(H0Tuyf0Dne4yZ`_I literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..025e61c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals + +import sys + +from . import Progress +from .helpers import WritelnMixin + + +class Bar(WritelnMixin, Progress): + width = 32 + message = '' + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + hide_cursor = True + + def update(self): + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + + message = self.message % self + bar = self.fill * filled_length + empty = self.empty_fill * empty_length + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, + suffix]) + self.writeln(line) + + +class ChargingBar(Bar): + suffix = '%(percent)d%%' + bar_prefix = ' ' + bar_suffix = ' ' + empty_fill = '∙' + fill = '█' + + +class FillingSquaresBar(ChargingBar): + empty_fill = '▢' + fill = '▣' + + +class FillingCirclesBar(ChargingBar): + empty_fill = '◯' + fill = '◉' + + +class IncrementalBar(Bar): + if sys.platform.startswith('win'): + phases = (u' ', u'▌', u'█') + else: + phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') + + def update(self): + nphases = len(self.phases) + filled_len = self.width * self.progress + nfull = int(filled_len) # Number of full chars + phase = int((filled_len - nfull) * nphases) # Phase of last char + nempty = self.width - nfull # Number of empty chars + + message = self.message % self + bar = self.phases[-1] * nfull + current = self.phases[phase] if phase > 0 else '' + empty = self.empty_fill * max(0, nempty - len(current)) + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, current, empty, + self.bar_suffix, suffix]) + self.writeln(line) + + +class PixelBar(IncrementalBar): + phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') + + +class ShadyBar(IncrementalBar): + phases = (' ', '░', '▒', '▓', '█') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..6b45a1e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite, Progress +from .helpers import WriteMixin + + +class Counter(WriteMixin, Infinite): + message = '' + hide_cursor = True + + def update(self): + self.write(str(self.index)) + + +class Countdown(WriteMixin, Progress): + hide_cursor = True + + def update(self): + self.write(str(self.remaining)) + + +class Stack(WriteMixin, Progress): + phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') + hide_cursor = True + + def update(self): + nphases = len(self.phases) + i = min(nphases - 1, int(self.progress * nphases)) + self.write(self.phases[i]) + + +class Pie(Stack): + phases = ('○', '◔', '◑', '◕', '●') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py new file mode 100644 index 0000000..0cde44e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py @@ -0,0 +1,91 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import print_function + + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class WriteMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WriteMixin, self).__init__(**kwargs) + self._width = 0 + if message: + self.message = message + + if self.file and self.file.isatty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def write(self, s): + if self.file and self.file.isatty(): + b = '\b' * self._width + c = s.ljust(self._width) + print(b + c, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty() and self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +class WritelnMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WritelnMixin, self).__init__(**kwargs) + if message: + self.message = message + + if self.file and self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file and self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file and self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and self.file.isatty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +from signal import signal, SIGINT +from sys import exit + + +class SigIntMixin(object): + """Registers a signal handler that calls finish on SIGINT""" + + def __init__(self, *args, **kwargs): + super(SigIntMixin, self).__init__(*args, **kwargs) + signal(SIGINT, self._sigint_handler) + + def _sigint_handler(self, signum, frame): + self.finish() + exit(0) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..464c7b2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite +from .helpers import WriteMixin + + +class Spinner(WriteMixin, Infinite): + message = '' + phases = ('-', '\\', '|', '/') + hide_cursor = True + + def update(self): + i = self.index % len(self.phases) + self.write(self.phases[i]) + + +class PieSpinner(Spinner): + phases = ['◷', '◶', '◵', '◴'] + + +class MoonSpinner(Spinner): + phases = ['◑', '◒', '◐', '◓'] + + +class LineSpinner(Spinner): + phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] + +class PixelSpinner(Spinner): + phases = ['⣾','⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py new file mode 100644 index 0000000..bea4d9c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py @@ -0,0 +1,6452 @@ +#-*- coding: utf-8 -*- +# module pyparsing.py +# +# Copyright (c) 2003-2019 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and +executing simple grammars, vs. the traditional lex/yacc approach, or the +use of regular expressions. With pyparsing, you don't need to learn +a new syntax for defining grammars or matching expressions - the parsing +module provides a library of classes that you use to construct the +grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +``"<salutation>, <addressee>!"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`Literal` expressions):: + + from pip._vendor.pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the +self-explanatory class names, and the use of '+', '|' and '^' operators. + +The :class:`ParseResults` object returned from +:class:`ParserElement.parseString` can be +accessed as a nested list, a dictionary, or an object with named +attributes. + +The pyparsing module handles some of the problems that are typically +vexing when writing text parsers: + + - extra or missing whitespace (the above program will also handle + "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, + and :class:`'&'<Each>` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class +""" + +__version__ = "2.3.1" +__versionTime__ = "09 Jan 2019 23:26 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + unicode = str + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode + friendly. It first tries str(obj). If that fails with + a UnicodeEncodeError, then it tries unicode(obj). It then + < returns the unicode object | encodes it with the default + encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff.frame + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', '<module>'): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by :class:`ParserElement.validate` if the + grammar could be improperly recursive + """ + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) + + Example:: + + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys.""" + + values = _itervalues + """Returns an iterator of all named result values.""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples.""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a :class:`ParseResults` object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = dict(self.__tokdict.items()) + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + + prints:: + + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint <https://docs.python.org/3/library/pprint.html>`_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parseString` for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parseString` + for more information on parsing strings containing ``<TAB>`` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this :class:`ParserElement`. Useful for defining + different parse actions for the same parsing pattern, using copies of + the original parse element. + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + + prints:: + + [5120, 100, 655360, 268435456] + + Equivalent form of ``expr.copy()`` is just ``expr()``:: + + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original :class:`ParserElement` object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__call__`. + + Example:: + + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set ``breakFlag`` to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , + ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where: + + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object + + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`parseString for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + + Example:: + + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. + + See examples in :class:`copy`. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``addCondition`` need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + fn = _trim_arity(fn) + def pa(s,l,t): + if not bool(fn(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + ``fn(s,loc,expr,err)`` where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw :class:`ParseFatalException` + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + + - cache_size_limit - (default= ``128``) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method :class:`ParserElement.enablePackrat`. + For best results, call ``enablePackrat()`` immediately after + importing pyparsing. + + Example:: + + from pip._vendor import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). + + Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the ``loc`` argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s,loc,toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``parseString`` + + Example:: + + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``overlap`` is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See :class:`parseString` for more information on parsing + strings with embedded tabs. + + Example:: + + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``transformString``, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking ``transformString()`` on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. ``transformString()`` returns the resulting transformed string. + + Example:: + + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + + prints:: + + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to :class:`scanString`, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + ``maxMatches`` argument, to clip searching after 'n' matches are found. + + Example:: + + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + + prints:: + + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``False``), if the separating + matching text should be included in the split results. + + Example:: + + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + + prints:: + + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement + converts them to :class:`Literal`s by default. + + Example:: + + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + + prints:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns :class:`And` with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` + + Note that ``expr*(None,n)`` does not raise an exception if + more than n exprs exist in the input stream; that is, + ``expr*(None,n)`` does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + ``expr*(None,n) + ~expr`` + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns :class:`MatchFirst` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns :class:`Or` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns :class:`Each` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns :class:`NotAny` + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`copy`. + + Example:: + + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + :class:`ParserElement`'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ``<TAB>`` characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set ``flag`` to True to enable, False to disable. + + Example:: + + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + + Example:: + + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', + fullDump=True, printResults=True, failureTests=False, postParse=None): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if ``failureTests`` is True), and the results contain a list of lines of each + test's output + + Example:: + + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + + prints:: + + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + # convert newline marks to actual newlines, and strip leading BOM if present + t = t.replace(r'\n','\n').lstrip('\ufeff') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + out.append(str(pp_value)) + except Exception as e: + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """Abstract :class:`ParserElement` subclass, for defining atomic + matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """Token to exactly match a specified string. + + Example:: + + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use :class:`CaselessLiteral`. + + For keyword matching (force word break before and after the matched string), + use :class:`Keyword` or :class:`CaselessKeyword`. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """Token to exactly match a specified string as a keyword, that is, + it must be immediately followed by a non-keyword character. Compare + with :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + + Example:: + + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use :class:`CaselessKeyword`. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for :class:`CaselessKeyword`.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of :class:`Keyword`. + + Example:: + + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for :class:`CaselessLiteral`.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + +class CloseMatch(Token): + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``default=1``) maximum number of + mismatches allowed to count as a match + + The results from a successful parse will contain the matched text + from the input string and the following named results: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``mismatches`` is an empty list, then the match was an exact + match. + + Example:: + + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, an + optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *sets* of matchable characters. + This expression would match "Add", "AAA", "dAred", or any other word + made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an + exact literal string, use :class:`Literal` or :class:`Keyword`. + + pyparsing includes helper strings for building Words: + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`printables` (any non-whitespace character) + + Example:: + + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Char(Word): + """A short-cut class for defining ``Word(characters, exact=1)``, + when defining a match of any single character in a string of + characters. + """ + def __init__(self, charset): + super(Char, self).__init__(charset, exact=1) + self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) + self.re = re.compile( self.reString ) + + +class Regex(Token): + r"""Token for matching strings that match a given regular + expression. Defined with string specifying the regular expression in + a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. + If the given regex contains named groups (defined using ``(?P<name>...)``), + these will be preserved as named parse results. + + Example:: + + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module <https://docs.python.org/3/library/re.html>`_ module for an + explanation of the acceptable patterns and flags. + """ + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + self.asGroupList = asGroupList + self.asMatch = asMatch + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + if self.asMatch: + ret = result + elif self.asGroupList: + ret = result.groups() + else: + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + def sub(self, repl): + """ + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") + print(make_html.transformString("h1:main title:")) + # prints "<h1>main title</h1>" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + + - quoteChar - string of one or more characters defining the + quote delimiting string + - escChar - character to escape quotes, typically backslash + (default= ``None`` ) + - escQuote - special quote sequence to escape an embedded quote + string (such as SQL's ``""`` to escape an embedded ``"``) + (default= ``None`` ) + - multiline - boolean indicating whether quotes can span + multiple lines (default= ``False`` ) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True`` ) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``True`` ) + + Example:: + + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + + prints:: + + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """Token for matching words composed of characters *not* in a given + set (will include whitespace in matched characters if not listed in + the provided exclusion set - see example). Defined with string + containing all disallowed characters, and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. + + Example:: + + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + + prints:: + + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError( + "cannot specify a minimum length < 1; use " + + "Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """Special matching class for matching whitespace. Normally, + whitespace is ignored by pyparsing grammars. This class is included + when some whitespace structures are significant. Define with + a string containing the whitespace characters to be matched; default + is ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. + """ + whiteStrs = { + ' ' : '<SP>', + '\t': '<TAB>', + '\n': '<LF>', + '\r': '<CR>', + '\f': '<FF>', + 'u\00A0': '<NBSP>', + 'u\1680': '<OGHAM_SPACE_MARK>', + 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', + 'u\2000': '<EN_QUAD>', + 'u\2001': '<EM_QUAD>', + 'u\2002': '<EN_SPACE>', + 'u\2003': '<EM_SPACE>', + 'u\2004': '<THREE-PER-EM_SPACE>', + 'u\2005': '<FOUR-PER-EM_SPACE>', + 'u\2006': '<SIX-PER-EM_SPACE>', + 'u\2007': '<FIGURE_SPACE>', + 'u\2008': '<PUNCTUATION_SPACE>', + 'u\2009': '<THIN_SPACE>', + 'u\200A': '<HAIR_SPACE>', + 'u\200B': '<ZERO_WIDTH_SPACE>', + 'u\202F': '<NNBSP>', + 'u\205F': '<MMSP>', + 'u\3000': '<IDEOGRAPHIC_SPACE>', + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """Token to advance to a specific column of input text; useful for + tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """Matches if current position is at the beginning of a line within + the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + prints:: + + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """Matches if current position is at the end of a line within the + parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """Matches if current position is at the beginning of the parse + string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """Matches if the current position is at the beginning of a Word, + and is not preceded by any character in a given set of + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``WordStart`` will also match at + the beginning of the string being parsed, or at the beginning of + a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """Matches if the current position is at the end of a Word, and is + not followed by any character in a given set of ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` + will also match at the end of the string being parsed, or at the end + of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """Abstract subclass of ParserElement, for combining and + post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given :class:`ParseExpression` s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` operator, which will + suppress backtracking. + + Example:: + + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def streamline(self): + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + operator. + + Example:: + + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + + prints:: + + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(Or, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` operator. + + Example:: + + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + # self.saveAsList = any(e.saveAsList for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """Requires all given :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` operator. + + Example:: + + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + + prints:: + + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """Abstract subclass of :class:`ParserElement`, for combining and + post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """Lookahead matching of the given parse expression. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. + + Example:: + + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + + prints:: + + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[:loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat+1)): + try: + _, ret = test_expr._parse(instring_slice, loc-offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + # return empty list of tokens, but preserve any defined results names + del ret[:] + return loc, ret + + +class NotAny(ParseElementEnhance): + """Lookahead to disallow matching with the given parse expression. + ``NotAny`` does *not* advance the parsing position within the + input string, it only verifies that the specified parse expression + does *not* match at the current position. Also, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. + + Example:: + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to :class:`OneOrMore` + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + + prints:: + + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """Token for skipping over all undefined text until the matched + expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default= ``False``) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default= ``None``) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default= ``None``) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + + prints:: + + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.saveAsList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``Forward`` not to overlook + precedence of operators. + + Specifically, '|' has a lower precedence than '<<', so that:: + + fwdExpr << a | b | c + + will actually be evaluated as:: + + (fwdExpr << a) | b | c + + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the ``Forward``:: + + fwdExpr << (a | b | c) + + Converting to use the '<<=' operator instead will avoid this problem. + + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``Forward``. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of :class:`ParseExpression`, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the + input string; this can be disabled by specifying + ``'adjacent=False'`` in the constructor. + + Example:: + + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """Converter to return the matched tokens as a list - useful for + returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. + + Example:: + + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = expr.saveAsList + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """Converter to return a repetitive expression as a list, but also + as a dictionary. Each element can also be referenced using the first + token in the expression as its key. Useful for tabular report + scraping when the first column can be used as a item key. + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + + prints:: + + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + + See more examples at :class:`ParseResults` of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """Converter for ignoring the results of a parsed expression. + + Example:: + + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + + prints:: + + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + + (See also :class:`delimitedList`.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """Decorator for debugging parse actions. + + When the parse action is called, this decorator will print + ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. + When the parse action completes, the decorator will print + ``"<<"`` followed by the returned value, or any exception that the parse action raised. + + Example:: + + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + + prints:: + + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """Helper to define a delimited list of expressions - the delimiter + defaults to ','. By default, the list elements and delimiters can + have intervening whitespace, and comments, but this can be + overridden by passing ``combine=True`` in the constructor. If + ``combine`` is set to ``True``, the matching tokens are + returned as a single token string, with the delimiters included; + otherwise, the matching tokens are returned as a list of tokens, + with the delimiters suppressed. + + Example:: + + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``intExpr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """Helper to quickly define a set of alternative Literals, and makes + sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True``, or if + creating a :class:`Regex` raises an exception) + + Example:: + + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + +def originalTextFor(expr, asString=True): + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns astring containing the original parsed text. + + If the optional ``asString`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``False`` if you + want to preserve those results name values. + + Example:: + + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + + prints:: + + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains ``<TAB>`` characters, you + may want to call :class:`ParserElement.parseWithTabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r"""Helper to easily define string ranges for use in Word + construction. Borrows syntax from regexp '[]' string range + definitions:: + + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + + The input string must be enclosed in []'s, and the returned string + is the expanded character set joined into a single string. The + values enclosed in the []'s may be: + + - a single character + - an escaped character with a leading backslash (such as ``\-`` + or ``\]``) + - an escaped hex character with a leading ``'\x'`` + (``\x21``, which is a ``'!'`` character) (``\0x##`` + is also supported for backwards compatibility) + - an escaped octal character with a leading ``'\0'`` + (``\041``, which is a ``'!'`` character) + - a range of any of the above, separated by a dash (``'a-z'``, + etc.) + - any combination of the above (``'aeiouy'``, + ``'a-zA-Z0-9_$'``, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """Helper method for defining parse actions that require matching at + a specific column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """Helper method for common parse actions that simply return + a literal value. Especially useful when used with + :class:`transformString<ParserElement.transformString>` (). + + Example:: + + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """Helper parse action for removing quotation marks from parsed + quoted strings. + + Example:: + + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """Helper to define a parse action by mapping a function to all + elements of a ParseResults list. If any additional args are passed, + they are forwarded to the given function as additional arguments + after the token, as in + ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, + which will convert the parsed data to an integer using base 16. + + Example (compare the last to example in :class:`ParserElement.transformString`:: + + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + + prints:: + + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. +Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`makeHTMLTags` + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """Helper to create a validating parse action to be used with start + tags created with :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ``<TD>`` or ``<DIV>``. + + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: + + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` + - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))`` + + For attribute names with a namespace prefix, you must use the second + form. Attribute names are matched insensitive to upper/lower case. + + If just testing for ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``withAttribute.ANY_VALUE`` as the value. + + Example:: + + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """Simplified version of :class:`withAttribute` when + matching on a div class - made difficult because ``class`` is + a reserved word in Python. + + Example:: + + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = SimpleNamespace() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infixNotation. See + :class:`ParserElement.enablePackrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the + nested + - opList - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(opExpr, + numTerms, rightLeftAssoc, parseAction)``, where: + + - opExpr is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if numTerms + is 3, opExpr is a tuple of two expressions, for the two + operators separating the 3 terms + - numTerms is the number of terms for this operator (must be 1, + 2, or 3) + - rightLeftAssoc is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of :class:`infixNotation`, will be +dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """Helper method for defining nested lists enclosed in opening and + closing delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - closer - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - content - expression for items within the nested lists + (default= ``None``) + - ignoreExpr - expression for ignoring opening and closing + delimiters (default= :class:`quotedString`) + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignoreExpr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quotedString or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single + grammar should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond + the the current level; set to False for block of left-most + statements (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form ``/* ... */``" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form ``<!-- ... -->``" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form ``// ... (to end of line)``" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" + +javaStyleComment = cppStyleComment +"Same as :class:`cppStyleComment`" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form ``# ... (to end of line)``" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or +quoted strings, separated by commas. + +This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. +""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """Here are some common low-level expressions that may be useful in + jump-starting parser development: + + - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, + :class:`scientific notation<sci_real>`) + - common :class:`programming identifiers<identifier>` + - network addresses (:class:`MAC<mac_address>`, + :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) + - ISO8601 :class:`dates<iso8601_date>` and + :class:`datetime<iso8601_datetime>` + - :class:`UUID<uuid>` + - :class:`comma-separated list<comma_separated_list>` + + Parse actions: + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`downcaseTokens` + + Example:: + + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + + prints:: + + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional + scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (``0.0.0.0 - 255.255.255.255``)" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) + + Example:: + + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + + prints:: + + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """Helper to create a parse action for converting parsed + datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) + + Example:: + + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + + prints:: + + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (``yyyy-mm-dd``)" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """Parse action to remove HTML tags from web page HTML source + + Example:: + + # strip HTML links from normal text + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + print(table_text.parseString(text).body) + + Prints:: + + More info at the pyparsing wiki page + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1]+1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [ ] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f), ] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff), ] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff), ] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8ed060f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,4 @@ +from .core import TomlError +from .parser import load, loads +from .test import translate_to_test +from .writer import dump, dumps \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea4e3bbd433d4e5081f04e6f4f62cf7ff30f5c01 GIT binary patch literal 385 zcmZ?b<>g{vU|`Vf?~JKuU|@I*;=nKy0|SEt0|P^`4Fdy13PTEG4nr<u6eA;u&6LBG z%N)g=%M!%`<}>H8=CVbxf!QoM?719K9J!oPoQw=9ticSLY%du>mN4Gp49U;UaV;v! zFVbYX#gdbsm~x91L>6l@-V!V+O3W+HNi0c?FUgNDNi8k`sYxl#Ex5%BB8&Yrxo)u} z=NF|Gfn0Wrtst?eIJKyVnSp_!h=qZH;T8)>QxPkO$yQ#JS&~{*#0HXNXJBAh$xy@t zVuOfZ1^NX=nPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw z<pu@@2I&R*A^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI(l4ki$<NKvkB`sH h%PfhH*DI*J#bJ}1pHiBWY6l94VvwtN7zG%47y+;|WwZbQ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6308a62f9da4a1e5828c06686e9e5bab7db05cbc GIT binary patch literal 948 zcmZ?b<>g{vU|`Vf?~M7&$iVOz#DQTJ1_lNP1_p*=5e5bZcZL*(6vh^Y6vkABX67iy z6sBMXP3B~nS`f_yQ?J6nz>vxi#hAhn#gxLB!qmbL#hk*N!qUPJ#gf9B!q&nN#hSt% z%%I6}i!&rYH^;T8D8DF~6=Vhj0|SU=XJBA(23f7gz`#(#uz<0Kp@y-BsfM|RWg#mg zh|LhsRKrxm5YJr0T*DC0Qo~Zi5YL*z5X_*-=%>kcizlcwuOu@!6>Rh^j`;Y@yv&mL z_*?9`sl~;K>8ZC^ax(K$Z!st5=iK5*%gjm5OUzBxWWB{woSKtX1oC+i$Q?y&3=9lK zAlIy9DB@&bVEC1zUr>};mRORiUzS*;pO&AKl3G-(Z)B`*Y-VOwZc$=sUYr-7VquhP znPO>bVr*J&U|?X7UZ5YMUyxa#o0(T!l9-dDYhjR^osn&n0}=$|__EZzl>8$7g36No z+#LPn{GwF7g32Oh1_lODuoi=3iBX7=4GgP<;K8N`^I9?^H2gp`$l2iVlVD(ANMT&S zP{WYLSi_LTRKt+PT*HvXvXCX1L6ga^im$p>qq<f{p}JPn3PiBpVoS>}%1tZ*dm1SW zKtZC(Si}Je4^TjWL!$`ftXu5y@x>)Y@$n$xVvuVY7^?)49SD{s&wYw;b2O?Ii$D%V zBQ-Tyi?~6K0yz-Ly`VV5;a-mT_@dN;qWE|oPzr-O7$rm@(x7z25g!jq8S(MAxZ>k; z^HWN5Qsd)q@x;d$mL}#vWQstMR0J}sh!^A#P%uD32h0KmQ4uIkK)4tbF&vB>>>SKs cF+WYFB9H^X93)L}owqn_Ahz0pwS%G<09?Mzng9R* literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..204a80411599d15e762a6f95a429bd14f9ce0166 GIT binary patch literal 10065 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 Mm<WeAhd37_03kD9X8-^I literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb76b5c8268fb0a18adba0879cdb189602fb62ee GIT binary patch literal 1248 zcmZ?b<>g{vU|`Vf?~M7&%)sy%#DQTB1_lNP1_p-WAO;486owSW9EK={6s8pB9L8Lx zC?-aRN|99NRF*WRDArWARQ5EcD2{N3JQ)^-RL*R!A{Rym5KLtT$wqNRGUPEuFr=`g zu(mKnaiuT@Gib8C1li>Gk`d$p##?-8`9-;jCGkaR$;QUUmdPMtkOC$K1_l-e1_o!4 zQywueFqAOVFqAMhGZo3CFs3lIFw`(CU|PuF!qChZ43T4QW-1CvVNPKI$$`Xc8EY7d zyg>R=SS2BPy=oYP8B*A47*p8iFhTXPWU(|e73HOHl(5z?G$YHfH8T};rEu0T6g8!A z<uRpjBk5vqW-3~g!c)S5riZhcsc26MZwlW6t{R4g$fj{OGZkG(;jdwUn!=MJ08!J- z*u<E^5X_({=m+;cGt~RRAn!{tFfe2?)G)*f#W2+})-sha)G#$O)-X<HDr5;}SjnKt zcuTOPC^4@%C$S_oz9c`sB(=Cillc~tp201~>|2awMWB!b6Tfow3yLz!5=&C`%My$9 z)ADmtQj3c9jg0k;&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf| z5_58NEevwAGqR0xK!RW#UzVDel3%1>P+5|no1+hMfL=l6FD{#u%;b{f{M-UNUXV{f zvC76!rHbKNJ)4~T<iwm}J3WLBcwm5ZfqVcC3=swfhICM1@YFJvFw`(MGfo5t1K4|- zj76-Vbj4J}#=yXEi?ISM3L!Wd7#MzW+2mvvLmb3Utb^b>ia?3;7HeWrQDUVg(=C>g z%7WBetYwKgrKz_#QW8s2OEPm)Z?Poh=jYsFDJd#Vy~UcAm{Xj3i#;>1BsD#?=oV{Q zPJUuZ6<f8Ho}qc|Ew<v4qRhPXDzVbM)QW=C<dW1B1+Z~e3e}25wVJ%QxH5~uVV;+q zdW!`VmbX|lOHy--Z?S+}RV2W`z)%EAD@B4J|8m7==9R>QoK<{_xwxdLNE9T>2FYT# zc;g|~K^5=>mF9sQ>{?WmU!=)Y1j_ig7!x6Z1q$vWP>6xUlN%INDxhr1$i*nc$i>LV zD8$IZ#Kp+N$OjkUViaKHV&sCx05{lew^&O{GINR{PLu&ThP^Z|GdVvcwMY)cW6sPg zxy6!`pO;=F4dQe9CFZ7r9R#))$t`dP-Quvx%}*)KNwovTMlmP^I2d`Dm>4<0u3=&1 GVgdkNuQ#0l literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa0dabffb8841ca3a96570cd2366d10f18d9b9cb GIT binary patch literal 2147 zcmZ?b<>g{vU|`Vf?~G|=V_<j;;=nKq0|SEt0|P^`2Ll5`3PTEG4nq`#W{hG?Wn93N z!nBYviaCWjg{6fdiY0|Lg{_4liZz8jg`<Tbip`xNg)@b#g&~D2l_870nK_Chg)x{x zllvvee7~vyjhK{blUhw(5N(8@L!f*sG+HA@FD6A>(_X{gDyl{!T3a_ZCZ*b_RuiU9 zGno-&FarYv69WSSGXn#IGsx{43=9k<3=0@*7#1?tGS)B_$<%;c&bW}Vh9R4|NFjwG zn4yHZhOrssHYUF!kRh5Zx44SZl8udxE#r$)Z?WbkmLzA~Vofi~FD<wwP>@(uoEndi z*JQfISaypscO^p+2Ll7cuU!3tqRg_yl2rYKE){G623qGEj`V|`;YGqZAw5=-;q zy!aFgqg=}rOH&hL({cj?1B3Je{Sf_v%mUrayyB9?oE%*XgWT+lY@-~IAQ;D&rRJsN z7wH#NmgMK==$Dpc<`nA{RNmr6aSt2F&md<oFmf>pF|sfgf#Me)G$0N)ENFIsgQkSB zhG7BILU6>kGD$KtGu47bm_d<SWKhCV!>|C%Zf2}y%411ku4Mv?uq<ROssQU{PGMQd zn8Mo3l)@&$02N_}h=?=PGMBKHuq|LuVXk2Y$uDGTW~^n&6M%`PFhfLY7-QIKS!)?; z*=pHqIchme*cPzWu+}itu+^~FaMW;?FxD`oaELH8GuE&y<OpWa<n((9^6N`>1_lOj zq`d_B`X$JNFKrkY7+!KRFfe2~IPo)Ra@=ChO)R*@oS9d0iwzu!#YLdBeTy|MCqJ>| z7H51&W^QU!eqQP=j+Dfb)RN5H)LWb&G9@*qBvF&A2xQ4E#-dxSxtYmD`L`I;Z!wir z-D0e~#h7x7(c>1Q?=8k)aO6V>kkv)33=9lBpx6)rB}+yzMlMDHCKe_xMioXeCIKb^ zMz9Ka%zzRs$V1>n+s44aP{Xi*VIc!3$)+%5a~3I-FoF{9LWX9>6h<kAJf;*-JTay) zWiu5Sfnp_3uLi_pDRM|*sb$LJN@1;Ks$t}2sAWuHTfkhyR0GxrBE=XMf@3j@rKqHa zVF7Cj`$EPVCUJ&fke#e4955azYiM%%74gG@_!eW-FGlTOjJj0<)dscIhE@hfwN}+e zAgW44HBwhKS64M9MAgGe)z?ZjSWh*rN)SU-lkFB~X-RT^T3T^xNs$l(1H&!elKhgy zocQ9@<ovvp;#+KK`9-;jCAYZ2fejJ8#Zg>Rlm?0tP39s{Fx_GSnQ)7(xHK&-vjP(A zpaf6^3j14p5F=ojR2CEs65wdyV3c9vU}OVh7DhHkF(x)fKBgjV1_p*?kOCM6l_B7= zPlthlA(bJDF@+(DDTOhGsf7V|iI>6|%%I6tBnmPNWB|x85DmiMcm<`-8paxicm{CT zGWuyU-eQjj`6RVOlj#;qacWN5Ej9=r-A^3x@tJv<CGqiwAm4zDWMHfkf+t-)m~=8& z3R(<;N;9y{pfIap$YKa)&;;391oD<9Q;{wx{Fzcp&@3xbVPIe|L9#~}VGlg=uv-Mm zSWwS_4TV}#WB^J;;1~iEoFI#tQ;JK>k!;~b*pgCQ0yiI&lRy~k5l~$O^2h?lg$$sK zP|H-ql){wFP^6T?T+3X;#LWOMrdU91usll*Qw>WBqX>fpLoHJZ>jI`4<{Fk7riIMG z44Q06iMvP{<U%C|28JrW>e^~6Jp&^ssmTlut|C>C0yR)=$qEiQh@Ze^19MSo@h!#- zu#X`G*n?~(Re6cIsa7CA3V>1rBOfCNBMT!36AL2;BM)Ph0K&%*rGA?1w>aYCLAv7O zZ*j%P=jNxB=A_2Q-{OgnFDy;Wfyfl;gWLj&r6N#rC<4V5#9nadf(eidz-bW_^u-_{ z4n_`U5Cn^Aau$h!B7vzW^%i?_er`c#PHGV-?SN|xaNz{b7Pr_+sxtG^^1+(0*>Q`* a2I5FNP--g%m3bVD986qH9Bdqd9KrxeFw|-Q literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..877d5bb1beccc6f75c80eeadf4212c26611400f4 GIT binary patch literal 3582 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +class TomlError(RuntimeError): + def __init__(self, message, line, col, filename): + RuntimeError.__init__(self, message, line, col, filename) + self.message = message + self.line = line + self.col = col + self.filename = filename + + def __str__(self): + return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) + + def __repr__(self): + return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..3493aa6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py @@ -0,0 +1,341 @@ +import string, re, sys, datetime +from .core import TomlError +from .utils import rfc3339_re, parse_rfc3339_re + +if sys.version_info[0] == 2: + _chr = unichr +else: + _chr = chr + +def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): + return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) + +def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): + if isinstance(s, bytes): + s = s.decode('utf-8') + + s = s.replace('\r\n', '\n') + + root = object_pairs_hook() + tables = object_pairs_hook() + scope = root + + src = _Source(s, filename=filename) + ast = _p_toml(src, object_pairs_hook=object_pairs_hook) + + def error(msg): + raise TomlError(msg, pos[0], pos[1], filename) + + def process_value(v, object_pairs_hook): + kind, text, value, pos = v + if kind == 'str' and value.startswith('\n'): + value = value[1:] + if kind == 'array': + if value and any(k != value[0][0] for k, t, v, p in value[1:]): + error('array-type-mismatch') + value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] + elif kind == 'table': + value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) + return translate(kind, text, value) + + for kind, value, pos in ast: + if kind == 'kv': + k, v = value + if k in scope: + error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) + scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) + else: + is_table_array = (kind == 'table_array') + cur = tables + for name in value[:-1]: + if isinstance(cur.get(name), list): + d, cur = cur[name][-1] + else: + d, cur = cur.setdefault(name, (None, object_pairs_hook())) + + scope = object_pairs_hook() + name = value[-1] + if name not in cur: + if is_table_array: + cur[name] = [(scope, object_pairs_hook())] + else: + cur[name] = (scope, object_pairs_hook()) + elif isinstance(cur[name], list): + if not is_table_array: + error('table_type_mismatch') + cur[name].append((scope, object_pairs_hook())) + else: + if is_table_array: + error('table_type_mismatch') + old_scope, next_table = cur[name] + if old_scope is not None: + error('duplicate_tables') + cur[name] = (scope, next_table) + + def merge_tables(scope, tables): + if scope is None: + scope = object_pairs_hook() + for k in tables: + if k in scope: + error('key_table_conflict') + v = tables[k] + if isinstance(v, list): + scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] + else: + scope[k] = merge_tables(v[0], v[1]) + return scope + + return merge_tables(root, tables) + +class _Source: + def __init__(self, s, filename=None): + self.s = s + self._pos = (1, 1) + self._last = None + self._filename = filename + self.backtrack_stack = [] + + def last(self): + return self._last + + def pos(self): + return self._pos + + def fail(self): + return self._expect(None) + + def consume_dot(self): + if self.s: + self._last = self.s[0] + self.s = self[1:] + self._advance(self._last) + return self._last + return None + + def expect_dot(self): + return self._expect(self.consume_dot()) + + def consume_eof(self): + if not self.s: + self._last = '' + return True + return False + + def expect_eof(self): + return self._expect(self.consume_eof()) + + def consume(self, s): + if self.s.startswith(s): + self.s = self.s[len(s):] + self._last = s + self._advance(s) + return True + return False + + def expect(self, s): + return self._expect(self.consume(s)) + + def consume_re(self, re): + m = re.match(self.s) + if m: + self.s = self.s[len(m.group(0)):] + self._last = m + self._advance(m.group(0)) + return m + return None + + def expect_re(self, re): + return self._expect(self.consume_re(re)) + + def __enter__(self): + self.backtrack_stack.append((self.s, self._pos)) + + def __exit__(self, type, value, traceback): + if type is None: + self.backtrack_stack.pop() + else: + self.s, self._pos = self.backtrack_stack.pop() + return type == TomlError + + def commit(self): + self.backtrack_stack[-1] = (self.s, self._pos) + + def _expect(self, r): + if not r: + raise TomlError('msg', self._pos[0], self._pos[1], self._filename) + return r + + def _advance(self, s): + suffix_pos = s.rfind('\n') + if suffix_pos == -1: + self._pos = (self._pos[0], self._pos[1] + len(s)) + else: + self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) + +_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') +def _p_ews(s): + s.expect_re(_ews_re) + +_ws_re = re.compile(r'[ \t]*') +def _p_ws(s): + s.expect_re(_ws_re) + +_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', + '\\': '\\', 'f': '\f' } + +_basicstr_re = re.compile(r'[^"\\\000-\037]*') +_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') +_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') +_escapes_re = re.compile(r'[btnfr\"\\]') +_newline_esc_re = re.compile('\n[ \t\n]*') +def _p_basicstr_content(s, content=_basicstr_re): + res = [] + while True: + res.append(s.expect_re(content).group(0)) + if not s.consume('\\'): + break + if s.consume_re(_newline_esc_re): + pass + elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): + v = int(s.last().group(1), 16) + if 0xd800 <= v < 0xe000: + s.fail() + res.append(_chr(v)) + else: + s.expect_re(_escapes_re) + res.append(_escapes[s.last().group(0)]) + return ''.join(res) + +_key_re = re.compile(r'[0-9a-zA-Z-_]+') +def _p_key(s): + with s: + s.expect('"') + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return r + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return r + return s.expect_re(_key_re).group(0) + +_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') + +_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') +_litstr_re = re.compile(r"[^'\000\010\012-\037]*") +_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") +def _p_value(s, object_pairs_hook): + pos = s.pos() + + if s.consume('true'): + return 'bool', s.last(), True, pos + if s.consume('false'): + return 'bool', s.last(), False, pos + + if s.consume('"'): + if s.consume('""'): + r = _p_basicstr_content(s, _basicstr_ml_re) + s.expect('"""') + else: + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return 'str', r, r, pos + + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return 'str', r, r, pos + + if s.consume_re(rfc3339_re): + m = s.last() + return 'datetime', m.group(0), parse_rfc3339_re(m), pos + + if s.consume_re(_float_re): + m = s.last().group(0) + r = m.replace('_','') + if '.' in m or 'e' in m or 'E' in m: + return 'float', m, float(r), pos + else: + return 'int', m, int(r, 10), pos + + if s.consume('['): + items = [] + with s: + while True: + _p_ews(s) + items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) + s.commit() + _p_ews(s) + s.expect(',') + s.commit() + _p_ews(s) + s.expect(']') + return 'array', None, items, pos + + if s.consume('{'): + _p_ws(s) + items = object_pairs_hook() + if not s.consume('}'): + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + while s.consume(','): + _p_ws(s) + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + s.expect('}') + return 'table', None, items, pos + + s.fail() + +def _p_stmt(s, object_pairs_hook): + pos = s.pos() + if s.consume( '['): + is_array = s.consume('[') + _p_ws(s) + keys = [_p_key(s)] + _p_ws(s) + while s.consume('.'): + _p_ws(s) + keys.append(_p_key(s)) + _p_ws(s) + s.expect(']') + if is_array: + s.expect(']') + return 'table_array' if is_array else 'table', keys, pos + + key = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + value = _p_value(s, object_pairs_hook=object_pairs_hook) + return 'kv', (key, value), pos + +_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') +def _p_toml(s, object_pairs_hook): + stmts = [] + _p_ews(s) + with s: + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + while True: + s.commit() + s.expect_re(_stmtsep_re) + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + _p_ews(s) + s.expect_eof() + return stmts diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py new file mode 100644 index 0000000..ec8abfc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py @@ -0,0 +1,30 @@ +import datetime +from .utils import format_rfc3339 + +try: + _string_types = (str, unicode) + _int_types = (int, long) +except NameError: + _string_types = str + _int_types = int + +def translate_to_test(v): + if isinstance(v, dict): + return { k: translate_to_test(v) for k, v in v.items() } + if isinstance(v, list): + a = [translate_to_test(x) for x in v] + if v and isinstance(v[0], dict): + return a + else: + return {'type': 'array', 'value': a} + if isinstance(v, datetime.datetime): + return {'type': 'datetime', 'value': format_rfc3339(v)} + if isinstance(v, bool): + return {'type': 'bool', 'value': 'true' if v else 'false'} + if isinstance(v, _int_types): + return {'type': 'integer', 'value': str(v)} + if isinstance(v, float): + return {'type': 'float', 'value': '{:.17}'.format(v)} + if isinstance(v, _string_types): + return {'type': 'string', 'value': v} + raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py new file mode 100644 index 0000000..636a680 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py @@ -0,0 +1,67 @@ +import datetime +import re + +rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +def parse_rfc3339(v): + m = rfc3339_re.match(v) + if not m or m.group(0) != v: + return None + return parse_rfc3339_re(m) + +def parse_rfc3339_re(m): + r = map(int, m.groups()[:6]) + if m.group(7): + micro = float(m.group(7)) + else: + micro = 0 + + if m.group(8): + g = int(m.group(8), 10) * 60 + int(m.group(9), 10) + tz = _TimeZone(datetime.timedelta(0, g * 60)) + else: + tz = _TimeZone(datetime.timedelta(0, 0)) + + y, m, d, H, M, S = r + return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + + +def format_rfc3339(v): + offs = v.utcoffset() + offs = int(offs.total_seconds()) // 60 if offs is not None else 0 + + if offs == 0: + suffix = 'Z' + else: + if offs > 0: + suffix = '+' + else: + suffix = '-' + offs = -offs + suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60) + + if v.microsecond: + return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix + else: + return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix + +class _TimeZone(datetime.tzinfo): + def __init__(self, offset): + self._offset = offset + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return None + + def tzname(self, dt): + m = self._offset.total_seconds() // 60 + if m < 0: + res = '-' + m = -m + else: + res = '+' + h = m // 60 + m = m - h * 60 + return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..73b5089 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py @@ -0,0 +1,106 @@ +from __future__ import unicode_literals +import io, datetime, math, string, sys + +from .utils import format_rfc3339 + +if sys.version_info[0] == 3: + long = int + unicode = str + + +def dumps(obj, sort_keys=False): + fout = io.StringIO() + dump(obj, fout, sort_keys=sort_keys) + return fout.getvalue() + + +_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} + + +def _escape_string(s): + res = [] + start = 0 + + def flush(): + if start != i: + res.append(s[start:i]) + return i + 1 + + i = 0 + while i < len(s): + c = s[i] + if c in '"\\\n\r\t\b\f': + start = flush() + res.append('\\' + _escapes[c]) + elif ord(c) < 0x20: + start = flush() + res.append('\\u%04x' % ord(c)) + i += 1 + + flush() + return '"' + ''.join(res) + '"' + + +_key_chars = string.digits + string.ascii_letters + '-_' +def _escape_id(s): + if any(c not in _key_chars for c in s): + return _escape_string(s) + return s + + +def _format_value(v): + if isinstance(v, bool): + return 'true' if v else 'false' + if isinstance(v, int) or isinstance(v, long): + return unicode(v) + if isinstance(v, float): + if math.isnan(v) or math.isinf(v): + raise ValueError("{0} is not a valid TOML value".format(v)) + else: + return repr(v) + elif isinstance(v, unicode) or isinstance(v, bytes): + return _escape_string(v) + elif isinstance(v, datetime.datetime): + return format_rfc3339(v) + elif isinstance(v, list): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + elif isinstance(v, dict): + return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) + else: + raise RuntimeError(v) + + +def dump(obj, fout, sort_keys=False): + tables = [((), obj, False)] + + while tables: + name, table, is_array = tables.pop() + if name: + section_name = '.'.join(_escape_id(c) for c in name) + if is_array: + fout.write('[[{0}]]\n'.format(section_name)) + else: + fout.write('[{0}]\n'.format(section_name)) + + table_keys = sorted(table.keys()) if sort_keys else table.keys() + new_tables = [] + has_kv = False + for k in table_keys: + v = table[k] + if isinstance(v, dict): + new_tables.append((name + (k,), v, False)) + elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): + new_tables.extend((name + (k,), d, True) for d in v) + elif v is None: + # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 + fout.write( + '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) + has_kv = True + else: + fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) + has_kv = True + + tables.extend(reversed(new_tables)) + + if (name or has_kv) and tables: + fout.write('\n') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..80c4ce1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at <http://python-requests.org>. + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +from pip._vendor import urllib3 +from pip._vendor import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +from pip._internal.utils.compat import WINDOWS +if not WINDOWS: + try: + from pip._vendor.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) + except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9154ea54f12b69bde2cd78bf300def6d7766c489 GIT binary patch literal 3496 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 N)M4jf<Y5wG1^{pV-5LM@ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b3d9a1297cb1e8f02103e6f7fb83b9fef1fe0f9 GIT binary patch literal 559 zcmZ?b<>g{vU|`Vf?~K{P$iVOz#DQT(1_lNP1_p*=9R>!56ox2<6vimV6s9Pq6y_-A z6qYEK6xJx#6t*a~6!s|g6pkp46wWBl6s}+fP3~J9MX80Qsl_G5RpJ4aB^mj73LYUL z0SamPMG79JxruqjdR0;xB_#z``uYW6d0m(Wz5Jr|DmEiMBSSrdOa?_JhALj~)V#dZ zk_?5Q)Xb8qD&gEzhir&Q5l8^6fy=QVF*zeu!AQ@bO2#?Apt2}4J)=ay$iUD-0Y!T$ z4+8_kqd6-SKFsgkpzvtU3O`M*Tb%LnC7C5Tsqyi*_~YYKQj3#|G7CyF^Yh~4Z?VV6 zmloy3$KT?Pk1tCtDu#%1#>Xd>X6B^C$KT?Lk54Qu$;dB?kG~}VXQ$>SW<qu4WG1KP z6@v`tjgL=;xh+2a7Ds%1a$<IBeEdp=B9ODd#II8Qf}+f_#FA9~vcw|&wEUcu)S_a2 zBV&DIGc&VtixNxo;=K423!_}i6iZVRW7Bd20|SHf0{syEg3JQl%)H`~#GD*m3xnM3 xjBKMEkRTYxm!;;V<QM6~!dV~5J9-6`w>WHa^HWN5QtenlQ7**5z`(+Y4gp?Wuk!!^ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..436aa8f992353b748b9411563441e44331c7ffa7 GIT binary patch literal 1317 zcmZ?b<>g{vU|`Vf?~L(aVPJR+;=nL70|SEt0|P^`9s>hI3PTh_3S$aW4r4A;6jLs9 z6mu?16bmCm3TFyS3Tq2v6l)4w3VRDf6k7^MFoPyn)jF=C)WXu#;*w&$_{_YL)S|q^ zocPj`%$#DbIuyXg6;PC4mYI@TtN@bEEU8pTE6qzT$;{6yRw&6xEKx`-N>xbC&nqs? zO-)gNnUzzikW{G<1hs>!JR>tXLm?%#AT=*VAwN$cwW6dbH8(Y<QXwt19K-`VKp`VF zry#YcSV5z>G&w^du~;EFKer&UM3d_!BPbY{Z?R<-#}`x@-QrFv&CDsu%!@BBDZ0fB zB3KiPlQT1unV`V~3LOx3hJ{cGLk&X-V>45cKn+7JQ=U`_Q;|Xq!vf|S#)XWvOnF>2 z3=3Ew>>8$E22IAQ)9#sNsd);C3dJQwnR)37`AJ!+$t5}pMXBkDMJYL{#l;HwX$mEk z1*sshlG38QVueJ7qSS(-)Z)~<l0;AlDdeYdDJUpF!U<|lW}ZSxMyf(yVo7FMD$H<* zF{ydU`6(c~67y0NQc|Iu@{H7?RIo95smZCu#fe3gdI}*KnZ*i;#h^ehR&We<_ViRJ z%>z5CBtIubA-^OewWvI^I8_g<QIqu+S7vc$UU5lcUUF&?C}4^}A$5xlY-Q>#Hn44} zn#{M@AkMtS0hY<kOTWdOUs|$~p@@fpf#FxBenC-YSz<}5epzCXep-G`N@`KDzLBxM zv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|F4zG%Il2}Gx!D=nMmZos zFpe)v%}dEI(ubu<eY7;GS5SFNpd>#Y5@?`E&&*5b14S*!RSc|LjBHFSj66(SOhq8k zWKe1WB?J)7!N9-(P6cKR3=FVTP|R1t)WlfH2TB1cj0+hV8B&;n8CV!fShBf_3>X<e zFoijoA%Y==C73~zwQ7q?YDsEQZf0JpLS~vmX<lY>ehNJH^7C>kL0O<AF*6Sq8_5}o zMTyBJsYS(lT;MpcDo89!%mqcbLMhY-R_F$m<SQg+q$X$UDfpHamnbBq!W4i_0Hq{Q z%E-$vQ3$9k$;i)BFj7b;E-6ZY#IjWpC>dEPB<1JlfHf4cGB7ZNxcO<a7O^ofFch&c zFfiQWb1W`SEdr%Z*P^2Qq9S&Xpin5pN3Nh0m<pEAWW2=zb0|3SAp|c-xd1c(;xmim z!TC-O9vAF<j7*GNj4X_Nj735W3=Dpnj9_PIvfpBlk59=@j*q{^2FcdoBnU~2AeVuo k4y*@a6DVpSEU=v%Ho5sJr8%i~oFKbE{$XJfVdfG50D~cWk^lez literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7727c5e050f90f55da2d8d98ec854c99626ae4b GIT binary patch literal 16894 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 J$igfj3jp0;&vyU- literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..010d73dd548778e0197d0d08c1266a1bb0a2586c GIT binary patch literal 6500 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de9bdf74e0cace5e809a2b43f299a0344262330a GIT binary patch literal 8351 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 F902=~>1O}{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab8172d562c61485ca09798a9fa01f5c8266536e GIT binary patch literal 642 zcmZ?b<>g{vU|`Vf?~J*~$iVOz#DQTZ1_lNP1_p*=H3kNT6ox2<6vh;$9L8LxC?-aR zROS@sY^EZmRF+hxW`<@)MurrYU<OUrQa45h2Ckyi!qU{@l48B&)S{ANt~wOJ#TAl~ zS*(zopHiBWs!)_#Qd*Q(tWc7Xs!&jrnwDBrl$xTDlA4xSnp2|S?5F@TA~P*BIk6;F zA*nPkB_~x+AtWQUC{-b|m@7Xor&1w5FIC}D!xXR)Aa+_&elC~;)v8dCn4F!Mo~p;i z<(Z~XnO~}qSd<DC%*;zy2!gs+M<G=&T~9|LEx$-1QNbrOue3rTC9}AsC^M<FBr`ux z0W6-In3tHIn!=TuSC(0npO>4OSE2(pG&wO(Avq&4FFh4(c}i+pW?m*lUz$QW$i*6( z3MKhaA1fp(6sHy>7A2OX=2UV)U6=y$Fw~P=FF_HZ$#{zutoIg2e0*+VW?p=}pC;=q z_W1ae{N(ufTfzmI1$yyisd*{+Mc~lROv@|+#T-a|USe))eEcoef}+g4l9dca91IK) z;#a<YK~ZK|Vo9ogSz?iXT7FJSYEiMik+Ht9nVDI+MTw<(abA3ig;B0$ilwQEv1z%1 zfq_AKfqsa7L1uw&W?pegVor{(g+Xq1Mz&E7NDz#n4$+6jzdk4iiuDRAZ*kb<g5%qc R50s+V7#J8>7<rgD7y(}}%xnMv literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac095196f91dce960631caaaaff48dff79789182 GIT binary patch literal 1621 zcmZ?b<>g{vU|`Vf?~Iws&cN^(#DQUE1_lNP1_p-Wb&L!QDGX5zDU2yhIgGhXQA~^= zHggVh6mu$b7E2UsDr*X(Btr^IHd7QEl+BvW6vdvxn8KXH5yg?pR`e-_F@-IMGnXrh zE0;TpJC`SlCzm&hH<vGpFPA@xKUW}1AXhL-Fjpu_2y8lgj&QDUlyI&{lt`{<lxVJ4 zlvu8KlsH(9BS#`vGD;H6X3mj{l1gDr;mncFm5Gu8i*e=1=E_FNg4x_Ta=G$R^0^98 z3b~3=in&TrN{kGt%26t*%2BGRYEjCm>QU;c8mXG8T4~Ht+8|aMQ<P5Lj#Tyuj76(b z7*lw1bTM24ay7b7V6NlM(F3^-tFQQS^m7fOq`)rY%rQiAu@T(G{5f(ESEewg2;>+e zyB_Xx<y6%u)l}tF)ifrs>$TFDKyFWCjM7PA4rb64tSaOxN-Zo+EiNh6OU}<NNG##1 zLj_!1AsLy)3c2|yr8%hz8Hsr*IjO}8nYjh|MI{OlEtyG~IhiGu3Yo>lrK!aVNvS2} zsi}Di0hJ{g`FRRP3W<3sTu_d&9@k4y!qH^B#h#pzSd@}l;`fq?fq~&AC>d#T-eN5* z%`Zv4#a@~RVQ_(|_=23$;#)jWK?sktv?wPvFF8LY^%hrpYDqy+enn<#@hu(@qcT3J zvLLaz_?84RFFrM|EVC#-FE=%><dzsh53;x>>n)DbqMU-nqT<wBT%|=hrFjrGdudTl zR(@t4Sh~0%C$r=h$OS2>X+??YnvA#j!OG$@N=gdib25udG#PKP`Q{fDr{-uf-r@)@ zDay=C_w?6fxy9j}n3I#3l#_ak-8ZqIATuxh7N2iv2}lIS=k_m3Ni9lEamh?B(c~)P zV_;w?;s+4|AVLsCaDoU{5Wxl_*g*sbh!6thQ`RD35F3<fi?~579uUC`l488YnVg@W zotc`ISft5VBnc8@E)oODi-QOWkbuc8_W1ae{N(ufTigYi1$yyisd*{+MMa>Py2V^v zS$vD9EVZaOGe0jrGcPUw7E63tYSAsW%;NZhN+T$3e2XQkI6v<eTWL{FPG(XOHphZ} zfyI?ry$tf%El@P%WF{GbJqYtkPG-_AHfOM}ibO!35M^LsxW%2EpOcfCT#}ieSB&OC zu(xk97nc;>;!Y~f%qhvtiwAL7lPXJ6i$SR`6Oyo!5{pxd!EtwsIWw>17E4ZkUivN8 zw4D6Jl3ToarMam^naS}bl?AEAw|F!2N>bBPi=bQ{h`;r~>Eae2ln2diw^%?4rAP|o zP96|b4-zTGx0o{XZ}B6!TrV*xc_l-U1;|?<;#YxwK~ZK|Vo9ogSz?iXT7FJSYEiMi zk+Ht9nVDI+MTw<(abA3ig;B0$ilwQEv1z%1fq_AKfqsa7L1uw&W?pegVor{(g+Xq1 zMz&E7NDz#nQLGPjV6i?VZ|fCQ-r}&y1?PS{P;?c$FfcH%F!3;Pu(L7qF!OM7u(2@e rFv~FVFmf>RF!C@;Ftad1AQvMS6C0xeBS;P;!^0@T1d-uj<X{8<(=y3- literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce0a05572f1d58fbaf312c0b93e9c652fc261a97 GIT binary patch literal 18796 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..772f4cab57f70552536003154bcb49db42b9f358 GIT binary patch literal 5514 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b83004bb63239c5092811e2fbd65ac0c5873470c GIT binary patch literal 2695 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 ZMgc}XMixdEMlO&XGlwFF83!u|BLHfC>PG+o literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..186ee0ddf9cbed563448aea7605323f160ae5a9c GIT binary patch literal 989 zcmZ?b<>g{vU|`Vf?~M7%#K7<v#DQTZ1_lNP1_p*=IR*xX6ox2<6vlMMD8>|~6y_F& zD5eya6xJ4oDCQKlU<OV0s*PMlsfDGf#U;gh8Tt9y#awkLfQu_6BePf`H$SB`Csm=K zD8DQ-CAC<gBqLQJIk6xyDKjUtBr~;GAuYcMEEoheOaW||LUCnrNouYh7nfsMVrEWa zQcfyF!itM4A)zR>xFA2TI5i=`ic3L3K_Mg~RRJcZke-^CT9jClnxc?al%K1Rr~oxt zkLwl(Oi?n-%OD!$ZD$4shGIUDw;5BIS{O<gTo{@egBdiL{gN3$Y8V(8K+0Gc7#M;< zN`)907%~}Z7-G3<8PgeR7$-9ovIH}%WGDiu(qy{Dq-Su8HMJ}?uLLXtCVu7X7Zhcd zC6=V>mn9bIr{(9Qq!tzH8yV{xo0*xFTa;Lu7w5&NSQzD6rdXPq7@L+G7#J9&7wCuR z7i1RbX66-_B<AGkS{USJXJi}YfCRxfzAQB_CBH}?79INF5Y#KE{KaLHl9^nRoS$1@ z2Xb&R$Z>28Rf;L8X^EvdCGil2HaYppi8;k~dI;5;jJH@l{QbRy!45|vSQ!`?Zt<e% z7X*a|$Ych_A`S)yhGb@FfUz+!Fn|Kg8>AqBfq|ihv4Aa;p_Z|RaREaO!$L+7tH`H> zv4$~)v6-nzt%fn3v6ityrH0XkAy%fArG}-3DUGp)xsS1ywT3l?DVwuMr-rqbsZb}J zp@s<*J5^>bnZ*T(CCM47#R`ew6rup~a%O&BVo{|+ex5?2LV9LdYMw$tW@>V(LVlV; zN@7W(-Yt&!_~gW#ocMS@O{QDS>8T~R*fSD~6H7{pG}&%3XQx))Vg(1zElv;>57Kmt zExSCiD82X=3rOe|7dZ65GMM25bre{MILP}VpfF+LVB}(CVdP?DW8`AwVdP-sU@QW~ zi=QUTE%x~Ml>FrQ_#$=&1_p3Af~Am*1_f~uIQ%(ma>2REju&J!IG7pPm^s)0#Tx{g literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e2c6ab380c8f7d40f4b7fe948f0025cf4e252c5 GIT binary patch literal 24117 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f085b540cdd4a9c0f51ee1e10f62e531d93f482 GIT binary patch literal 519 zcmZ?b<>g{vU|`Vf?~K{b#K7<v#DQTp1_lNP1_p-WItB)Y6owSW9EK={ih>j-7lzo3 zD8>}#R7P=zD5g~ARHkOeRF-CjR7M+y3ZGQgRE8|JW=0o=Si30pRQ6P+Y^GwrRQ3fN zsZ1#>;tUHJi%e44Q#n(Zn;BCWTbU#oqPRdhQrRULKy(UgDwjBe4MU+xI71;{I713! zFoP!BOOUJlG?{O)mloyZWF{HkV#!R&OT5LNoRL_Rl3G&5Q;=Dp7hjf|my%zkcZ*T4 zN)B0|D7COOwYa2MuOKlwJ25@ASWlDt7ISfB@hx_!$Snbg-qe(Mm<U&Vd}eMzeo;w$ z{4KVe{N%)(;#({^nZ+fy*mLt!N^??+Z!zcQr`+NyE=epZDK5_}$+*RwlbUynuQacq zC^ap!A~hvGH$P=1Ly;f@1BCchq+d{!S(aFms$Z5^q@R|blag9gtZ!tjZ)|2}R&G&Z zX<nQcpJHK@YnftcYGQ0!ZeU<wkY1o4qF<0%pqrUjT#}fRqibQ1o1Kwulmik3W2n#d qVII|odZJjbpz;=n4aB{6jG*Y`V_;z5VC7=uVB}*KU=(8%U<3fRd6?_~ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1947345a3fd9febb240f8aa0920a67ff5a5dddb GIT binary patch literal 19437 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..292b5f4c0d2c6636ef161e127e369ef580e8bb97 GIT binary patch literal 4175 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72f34a0706d7dccfbef96d1894e97908f3cea2bd GIT binary patch literal 4388 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 LWML9v7VrW9B=#zH literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fc2ad3ebb3c0bef0fd3e91f64f83f10c4f1bfb7 GIT binary patch literal 22048 zcmZ?b<>g{vU|`Vf?~F+-Wng#=;=nL70|SEt0|P_xA|?ig6ox2<6vh;$9L6X{FwGRj z1g4pzn87ql6bqPUjba7UY*B1rnmvjgOmjqWfN9PsPB6_C#RaChqqtL;Q&@6%a(SY7 z7#UKSQ&@9&bNQn9z-+c0{#=150Wh0AM=)0?N*K)M$PvsHi4w^bjS|fjixSHfj}p(7 zh?2;ajFQZiijvBej*`xmiIT~cjgrlki;~NgkCM+-h*HQ^j8e>1ic$ib!I`6+s}iLG zW^?7J=Bh=hf!W+S>bV+G8o8QLnz>q0TDjU$+Kdb-JW)ESd<%3JGDPX6@TTyk@Xuk2 z(of~cGDs1~W}3iQWRxP9BGkeVWtbwIBGSSTC7mLgBG$qXWt1YGBGJMSWt@_cB9$WD z!Wd<eB9kK9!VqPeB9|iH!VqPaqL8B4!VqPiqLiZC!VqPVqLQN8!VqPdqL!lG!VqPZ zl9{5BqS?Y2Wu2mxqTRv}Ws{<lqT9j{Wt*axqTj+0WtU=*V%WkEWuIb{V%)+I<&a{M zV%owG<(OiYV&1|K<&<KPV%fqF<(%r0V%5wT<(guhV$;G9<(6WbV%NeD<(^`n;?Tkn z<&ol;;?%+r<(cA~;?lwp<(1-^;?}|t<(<lu<&)x`;?cs;%oydH;+f*r!Vu+`l9l3} z;?u$y<)7l4;@83u6_Aph5|9$u!Wb2p5|k3$!Vndd5|R?y!Vndl61E^DC43=cRA_2w zN`weQR9I?gN~8!wRCr2MN^}cDR76TlN^A>5RAfqAN_-1LR8%VKg6Nclg^W=#U{>Nn z#;Dkoq?F_qhN!rdl$6vKhN$?Iw3PG~hNy%TreFrmoT@2YMX80Qsl_G5dZi_qImKLc zD1eJABqOs}AvZszG$&P|peVmAGbOcH0i-muq*5WRG%vX%Ge56bp(G=*L?N*#RiU&v zHASI3vm_%kPaz0uG#6YpF{d~mq$I60M<Ff0NFlYNB(*3nF-IXeKd-nnw*X|A9@k4y ze)4<C2+C%Rx47fu%TkMqGxPJ}<24y?u_mV$l@x0--V!LukIzdi$t+8aFD@y{%uCl~ zyv1LTSX7)EpHWg$5TBD-T%yT;i?y&cza;e*M`=+GSn?KYQe{bM@h#@!lA>GO{zWON zMX4z+naL%$*h}*uYPr%=OA3neD>74yZ}ET_mGMcH1&PJQx424+a!T_c=5Qq?7N<gN zzQvoFSCX2ZS`=SWS&&+Mi!HM_zM#_hmISiq_|&|z%%c3f+|<01TVe<+P{i4N6AKC; zei2U2&(F?G%}OkaPb<pLjZeu;F41JXCG4D7oa&iZoSIjh3GzJ1>6$FJxIFX95_2+B zLW6v6@j}@isfj76MYs6fGILUW^HWm86N~aP^U`mLhUOKemS^UrBqrsgI_0NSx)v4X z7ilt8vFYWdmJ}u5Vv7gUF9R4D7&3P=GB9W|-C_X+>Md3fS$vDNJTuSOC>az(ptxdV zU|`^2U|?_tm3<!=7#J$0N*Ia+QW#Shau{nF^FZYoLk?3dV>m;e2n$0Ab2e9z9wP$? zg3@6GL#0^_;{ui%#w^wp=7mhPOeJhJj0@Onm{M34GNmv|GBh*RGDAgJAtJRbP_sC) zxr(YlCNVNV%&K87YN=r<?f~&>SQc=muq|Y)WvPg$VR2!I4X9<UVNGGrW-8i{!coJJ z&0e%2g)^9;hIIi~3P%dpLMD*>0<IM96dpL6H-!VlF5zClQ^Q)rP{N(XyO6nP21sAw zjBv26ntXmmpuljevJTEqD=AMbN{#W&OfJeV&QB|e3D3++$uBRCaV{+?O3f<?gQVsd z&pc4#Pc2ahPAw_P%u6qh;tnXvuc&m*1I0@eFPP(BmReMlnUea8(YlJ=CMQ2RF~{x} zqh3fAQ;gm%My)C)J*{7i_L_V}LJSNHx7f-v^NLc_Z?VTi8Qh+^1^GoK;0V6O?q86a z=bc)4OVGpHH8S2gG$_c`FC;!R*fr=Db7o%2EuO&A)S}9;#GKMp*NR*0{=pD^ti=U6 znI*T_i&6`65|dMJF%_lWV$Dq~NzS;%=&8weizOq!xTHvxfq@}P0F)7m@={9>egfwK zn4iELn4fO3l%y7ytYj!MVPIhRm9Jk=lv$QolB!>pSfrnppOcbWRIG1gtZ!^)W>#)d zVrgES7oTEblxvw{X=-9@T5e!qV31y*AEIB7S)iMlS6q^qlcQ^4kei*6ZIlBN1mpO! z)V!4ZB7Imnrw=N;iuDRAZ;65(1I^m;MXBkT#U(|R`k*vy0ZP@3OpGjyTueNSe2i>N zOpF|iY)l-CJWOnid>|1<4n`JME+#HU4iJlx2Mh%mIT(w~7#JAfSp$?Rm|$5$ih+Tl zgrS+Ch_8gPhM}1;n4yFTLZ>hWGiWkZ%?e5_DJ{xV2q`K})ltYyQz*$uRRD#qLUBfZ zX-<klQmO)^C`wJy<Kj|)0_Tj><m_Tl`CL({Pz+5?3h9X@8KA;V0aSc|O+qSxz@`@$ zq$X#kWu~U+z>Uf;0;`0Dh8|qPPm{Swgn@yfNEk$b{HV!TWCUV^Vh<dJMW!Gw9|HqJ z7$^`yr2+#R8zTo(5l9RrNI)$maA_e14w4#%6vk$zBB2_F1&j+BY8h%6z`>yp365fg z#5@H^!b;3hC<fIkdC92?paL;7KQFPUQlYdUC9xz`?-pxjNosDfCetnUjKt!^l9Hk# zb4Vq^m;!Mj*sUOE-Vy+5k1xrOhnbfIcQZ2=$jw&B(a6HUz`zNMMiWL*>#mkDg|U{Y zgrSBZg{hgTNCpz6wTyX5U@_)qrXsx>hAdF|7XTJvX=W;_tK_L+SirQ9p_VzEAx{ic z7G|+za}`BFO0Y<VJe3HB64nK5HOvbcv)F4HQ&?*lvN*EYi|R@^7jUJpm2fX)Vq^fD z$KDKTMM;27<XOm2%M{L#r^3Qe!dt?Z#+1!fv<qTp4Py#JHfPbc8pc|tNQS()2#9VD zh;Fbf#{|YAiAuE^h6Vg7j47NT8)_I9fXrkBiPbO_d`e+l$jHbL&X6aEuwepYkr>2| z6vkS{NQOM72nM)$Y9O%^ffU9X#u_FGhGtNEg9}nh-eQlB&q>XTkH5v7lbUynEiE%A zH81}bV^X3jBLf4h)u51(SgeqeT9R6no0*rI0#266`FSO&c_q3zsd?!o8Q>;F38;Yr z&D;v5#hH2OV3kRk;Dk|}S(U1g56MR$YpfJ9^2<}pQj2uJsz5?udy-O9^Az$6Qb87F z<|&k<R+NBRJ*f&BnR=;u;08^8X$e@5dXl<AT25lR0!Up(Dp;AOo&uzylvt^dlbV>K zP?8Txv&s2IMXAXpp!N-t!}SzA5v?NyV?6^Mh2qizP(iIwo|%&a%H>6=x%p+ODPS*x zTv-gZ4(2R9P|=x_bBm=oH8uMssC>~BECLl;MK+);XbY+fm@@NkiG=1s4Ngt*FGwv) z1U0a3G36KEVofV9Ni4a=UR)9n3Zq*rx%nxnw>ZinO@!iGEFe}9sK6?+2N|gYGLqfX zA6z38fjT+2m~#^=G+Ayj=HKEe$uCLF0mW&0NyaUKWJo<1Uyu)KqU7flf!u?h|2T_F z3sQ?fda^+o4`d<(BMT!76Bi@6RAu5~WMbrD6kudy;$h)pWMO1tV`Jt4iwUuEFmf@8 zF)=amFmkX6F^Yh7urL+*GcYi?C4+(kRDSay=UFjE28POS;QkXsE<-I-E@Le-sP9tC zQsGs?<iZf^RLfc^R>GXcvVb*(WdU0a>q5qbjJ0ggRt9@ESCJPqtuqHRL@<C=a@4Rb zWGs@YVXI{cU?`LcXQ*LGVb10#%1dDmW+>qV745a`DXg^|C0w9(Lo-uRUk%3s9&n3< zqlP_;cL84w$3jL>3#XQ|(yWH5hNYQt0e=nWLdIII8m^*CHC!OMqJ1fhc}ywnwcIsa zHQbU6HC!nik_>4~!O;9z!(1W&&heihF05fJde_7N$&cX-c~UG4C4wbFAQclBiv%EQ zAhIBLYI0Ut!^&Aubpy|TC8Y&9sS1gu(2SO-ke*qVnx{}&lmn?zz->f5aJxs7=@u)P zdyC%>)Pf8EHN(M4#jlE`PQSYLGpHW4y2YAUoSd0i1d5>|M^MQuTm))k76pP*7q_2l zNRV^9o2QR!aFGj0gry*{B;yuWYDGa}UP@_kYSAsWwEUvn#FASa-l>pQ>n*m_ip=7Y z;v!J{^A=ZTF}NX+mz-Jz>ZadfOG!-zC2Y35)RLV1<RV>=v3wvurRJ4nCMTBU7Zn$I zffBenSjMrWq$o3~v?LYmcuk&L%%w#+w|I&YGmBH>Q$fw-Vk8%Hf&Cm0b|qulE#{p3 z<XcQdnYTE=4W{CfB1i=(12URDCqF$iFFq4JAMmB8mOz@@@gQfd0A&VHPG(?cViaHk zWd|lkF-ATXHYOfM7DhH^4n`Ix4i*+hE=Dd!0VXC!K1LQM0Y(u<A!Zgv9%d27qIBeX z3l!3zx(i&_I>GDO6sBh8TE-g2BD)gC8paY({bg6fn8GZ{kiwG9Tm)jXN;0Idf!N@b z&RWB`kTDq2)@83U2r0@;Ed~{G>7}W~px$4q0;rJ6OU#9rwvfb<pOlrFT%vc21tbM2 z{eLmqy!`+F|Nmc%cA9Lr*wa%>z!h~AC=vuf1Ssl@LP2510qSCbbZRo)V$M&>D#`%K zgX?fG0j|jTz;1|#*?$`pfS|;{z{JBS#mK{0l#d)B><kPHtgwoF7dSw&7#A?rFf3#& z5&$(jN*J;j7chhPF-*0LwM-R8HH<|;U{NMeAQVH`%pf*c1#=3h>%v^al+Lt}v6iV& zDI8LPGcIH-P6C_Ax_}*|x|Ri$!545W1a&)Vz%rZ*xE3<hvVu&{VyR(GW2|9XzznKt z=P~s$)UtuZ7chYenc{6VELq$&Of{@2OubCCY&C4b44TYUM}i<ta)rG7Ja9fp%_~s= zB}Y)4B$g=T<mYEA<YZ>2f@-cxg`(87)FM!{B`V~m<|d^UfvUztg{sT~a5FElC^;ju zEEQbafix(9x*MPx1FS3$)LSn~OfE@HQAo}&s00au%8Qc3qV&`f9R*N#KBqVpY*JQf zafw0^q%8|l106X?0lQ71G%q<LF)tm|gatKVe=+K7GJ+#qlLwsd!R(?)P+WuaD@#^> zX5KCKs>}jVB!e<}JdDjAm01Al-rnK>B@<AW{}x9{YA#e^dTI%Xlag6<i#@fX1mt*4 zcChKU*rA@i#Rdt9TWkeIscD%Nw>YXY3&4r#7IR5%!7V<hzSI<OHb>9BB2a0Ng9@N( zia}$7#R{M*h?R$lg++i-h*5x1h=~hax$!WvFmo_UF!C_+F%{J#CrwZh32HNg^Qs;L z1E^)mn9Whd1L_=rT6`spB}^sEB`j&6mZVw<YYI~{V-sTu8>pTEC5OZdj0_ARiP@>3 zwg)8VDJ15lD1drdpja<XO$GHSGD{Sa6Z0UAjDn)n;?z7)lqMD{B!c4()GmfJtMwE@ z^KwA>8>%BOzXXe};?m>{9av;1=7G&X8dlL!NYzW%(}8qWtgIk3DBA7p?7;O%e0FMO zd>N?ukXc-!5v`$~om#1`qo7`vn4_*4s|hv_q#nskJgTspsty^aQAd~t>Ewb6bSqG3 zfV`HP2dXL*AOQ!>K%gNlkerb&xHc??y9T>G)nLb4K^$L;unoW4!G>BDfyR!k6p)mH z#r>+ZlN0kmZXm{en(Rg3f)rHw6@fY|w^)+$^K*){K*cE+!qY|EpxT%57Hb)(vyYyt z1wlPVlz3rgWMC);8Ok8Q!N|fS1nM9)<4nAu#vG_iM?~Ufs9`8!Yi264s9{*Z4(j@q zaKMvu54DrCXPN>uDJP{OlB@!#*Z`MipaxGd-UM5cj}k0+5+Zs+21h0+9fML1x-q!Y z4M~PjEs;Y<7GNn76g*(plb94a(UM|O1E@p?rNp8}5K9z9fcodRSU^^2G8Q#~M8GvW zm;hJr{Agh%14@aY@dO5bSV{zU*ISWOBWQR5UdzWYFfgPu)G}5CfeO)PMi+)yw_2te z@MKIYlO#h8QwnnmBZ$Sqz|4@%RAiRIlFd})mB+%!kS9>WSi_XUl)?;>Z)U7zssXhY zm_VK3LcVZ@8ql~6Ya$af0|U6t3r<VL3gDh=adJ^+Qfi7qQl&zWo3nzEftiIua4LAf zT)_w$#-4c!1&Ku^naQO&iA6dfc5$jga(-@ZqHb|&L1IxNsAvX-PO(BcXfOv{EvM$B zf(DU`74p--@dB!0L249o6Dt)m^OAE)Q&JTQLBrlDx{!jeSWiL05miVb88n~-)(`4c zCuZg;BtmQktIf;L(}ftJ05JlhULhl~3~Dx{N16et@N+X$QgTxD6chqM))s@O0$^R( z#L|-d+(b}oJ13`7Au+8awFvCd%)E41D3mB9B^GBUCxR4|=NDxcLmDkspa}-61n_u! zd~s??d<J+#J3#^5z5vfEfCqfQz5sbXv7jI|u}C4eG^ZpJ)Ojh%%uNN29;GNGCl;qF zzy{4ha~GMQ@v_w7)S@y_I|OV(NJc8G9s?JP3Yo<Ui3-IfiFqlBMJWna$vKI|#a0QR zpiY2RWT4CpaUMt%>OKwilKkw{JRJokXb6H$Q-an$(GXd69R+n{Y4uo0)fkemkX)3S zSdyxcr~vUUxRwM*Jc<hx64Mhi^K?MdDIiI(51;{-Qkq);bxQ(#k_H;qR-jass{nSA z71(>Axf4j6FA<!4q1Hl%{;Z0?tvD-G-$N{e)>t5)g9ZE`9lI>hXfC6YCi5+!c#N>Q zB?6sgfw~V=^OvUHVgtooUWz6&xD2?(R+L&?np1L%1r)s)wG)P+7N9Z#)ZJ$gXJO=H z)L;}~<YO%AK`s$MogjFLPy?FRV5nuRD1w&=X|+r#j5SQz>_sXmOrRkv8-_x@8m0w| zDU6^gi5R9@=2}pL3|bP@Fr=`gFoDVhXqgd_!kW!glmjg@m})@NvMeC^W=4>{8paxC zkcrR|gDo+R3AMz?PgBTFt<-_Ui$XzSW)U%^2&j1n4*KN$yt33H@BmdVXs9$_AyJ{A zvLquv4?IkYlv-01Y{9uN6+EE?jRg($wETQqC2)FA%Ph`N(oslCEV5NfELJE_&B=i! zT~KNVwNf-vG(mX-)KUc74jQfoGe8Q8^NUJSQ#4ZaGC^ap8k&$+P_%}6QeqJ((L>Et z*VIwa09gwXgIlbw3C#wc;4!<RRFFM+`OshiO&KPF!U<H3!$!&y{POcsG4mtHad6*( znwX$T$^6n1NP>grMR2_vk1AuO05Y(a_}mDxDS;-r5o9v{+z3*U01kRsZ4D9u3;bfV zMaqyxZJ-7pb5T2}iUswmiaJ07Ea3cB)CCgl1`*hL*n*G@2QnENq7k4B2bv9F5Cdg6 z&=d$0qX0PL@h}$kfifOw<N?$L0@0w%2kzB?s^S`kq6kpqP!gP-BpIL?NFjweo2e)Q zoPkUb*{hbJhOx+{h9QMDg$<OQQrNSZLHZXkq_BhL<rXlcaDp;uFl5evtLk|uWEK}x zbVJKea9O9Ppr8>18u=|w%mFp_phYFP2!{F!k~9)DAtfJpKsO~nwO9ev_%1C5_n{Sv zQWJ9&AVnBxs5z;$M4=os_nlOfUtXLF%CtqP3W>=jrJ%YD91oB&X;9Jy*@dX|Pzz#E z9ggf=P=5_#O)A7Wu=p)5DFPb{9(OAOm9^lg1sA=3;6b%2rkI#tj4@SAF-n?@MWBwP zCKEWCZ*gZ9gS)n%zA{>=3Qi8yplAiR@;OvkdDul5MHs>2@TnV6y9yqeO0ZH?qK3hR zAyxp?rpjUfm7Q6PHVlPa(6WxPssT2<2+q6u;OGDsOOS3Rq<%|Oa0btJdnFd3)>O$^ zRtPC*?+g?=(4MyfWSYDfYzk^nff6h@tf2k}4<BhV-(pJ6y2TCA1}+3|u|YU!L2^qN zWB_FH9ikvBv1ke?h`_^3?4YqZ0j8oU=&2nPNZ`~C3ds^sfIwzH7^@B;0s`(?u)7to zhYY@eD9KmI%qs?!`4G2(nqwvT&;Wqc@em2H7p)XP>jXgQK0CD%5(D7zJE#$vc_sOX zK!zFut={1-g#;yI5opRzlc{JTsJNH}BEXGxFad6{izcR|fGq{hu0h<8l~}YG6mX!z zfPtfEDk#W6!yTXk0+gOW7#w6F;1M}cty{tbnuY=mKBh30FoPBb^fJ{lg83|PK2r(v z0+tlkg^=X|Y@kuQ8m0wcTAZPV8O91`&}6I1fdxLe9}SvshXg%jpc2#u1`VD;8oOu# z51DncQUI?UDFL^aO7daDVG5|`K?1L8iD#YybXKYuGQ$HJ=Y=bUr7G}r7W$-*o`PF` zkwR`hsP@Z)40vbe=jkXE<fKAcv5=xDC9^oWv>3E7Mj<~>A+xx+G*v;_$jHo0PeB7* zc!8#HK!sE>WbQaW57hjIw2<@jl2i3Gs}yZ=Q%e%{wCs~JKqK}gw$Vy4>akiHdfN7y zAf{a`XvGa^wyU^G8?F`-98k5^aJ@*ns#M}^V(cq&bM&<AVSa|HM^dH9UgQBvKc1k$ z2_cu%f}+%9@C+4np-K^GF8&sKa(-?>W=?96AxIf}8fe{0PL3uENCF&ux459Lk1tBS z#aU34n4X&mVzO1_=EN7JqUUNU+!3)3ltw{g&<w0Bj7-dIOahDoj9kn@j79U1Q!FT7 z!`qS|nHq)#44_e4(2#lxlO%W&8#J7r0&W2^G1M~EGG{W>vZS!qvQ}i&FuO3sCV<9p z!IRx=HEcyjHEbztOboT`wH!5U3z$;a7c$mz)^Mh9WHT4F)v%?o)Nq0-zXgn-X{lQF z8nznF6lQS-i1|=ajv9^{mKyd2%nKQ87z&NT89<}Wph+T4&Z=dwv=2+>pjI5H@d#=P zCgy@BSs?`|bdCp76G56l(0U3YWCiUFg3AJU-vB%|2A<<g%ml440y9Cm32qIjB!!mt z&`v98C<MuNuz^L2pyU857$DVI6|<7MLP$|BNEB4lX|g~ja9BaPwBQyCC@tJ#&B-rM zEz;z=#RhTWEjDoPtN0cV)U)74S-050Wn%FyZU_x7pl<PHg4(E{atdN1D_HUtb9QPa zq{igW%u7kFh|f=pPc1A>%qhl5Owb+<vQ^O5#34{(0!{reaBwk7L8mr3Kuby(L5oI& z7{wR`7>iaTCoE9S0m9&-5Ht;foUn?8Kr5O+^EJ(k;E4yO6y_SHY_=j3&;W)c!vfH1 zDbO4ZYYk&ITaiNw8+^W|78d=myoeIn9w8wC3Xrv8;93H;@Ph<uu@!QKjivAdm!*)h z551*Q1&at>P;&6Q#SYD`RZQwipn2?yk}59GV1Hc;3sXy7Lrvye%;~8m;D9Nb4{D<_ z-(rV4qG$;yB`gII;OYiUfa@Gd<V+1IT%meygQ5YPr`frfK=aEyOdO1SOdO0w8$dx1 zu8|lR7(fH>pjs#yG<{SA8hmHWVn_iEzbjP;f!jA+p!Q7|10zGBKsW<<NFFp2#F)jf zkP$RK)XP}QT%iC~DN)N(!@PjGhGiimXgOJtRShdxpH(<R4RaQA3Ja()+Y4T5R+I;k z1DU7EUL_S=Qk0sQs{om`1T|qZOF*;s`9*qukd_?dEjGwB<Y!Rb83HbzGxHKb<sk<w zc0ui#l+@(nTcYWyC7F52Md0D0#2kpJMMcq|P-VNt0W<p+V^I;P@qddQs^S)Faz<%h z_AREOGV}y5R}6MxJVa%DQEG8PeqM2Ed}&@LX!QI8D6}O&PGbg5P=cmBguqjkER0;B zsY=G8J;<RBO6>4Z_hDdQ04=GhVN7Al<|r1aVN7AnW-O9{^wDb>E3|6B%Waw&vl)uq zYCz>1Qw^gy1E^#Kg>Ma04Wl_jEmNT!bWt92m4YWY_)-<}%TkLJigPlPQ$eF<@L><g z?6sdJBY53}Ci5*eP&ts7ev1dJ7PLA6w4#BzARi;=bAv)J9;~dGiHU)s7(D*K#KI`R z$ic|RD8yKF0OV6pVFnHk<Ry}2XssO3=wu0V4MP?Sc!ZIu$g7g41hnvnt%eD-aE67U z1hfFb12T1A!?=K>20Q`@nZ&OYfT;ziL*`%x7KReeY_6gLsCtGhHqerV6qaBHP1dSM zu)+Y;<$yL(z*BnQ%2XjKF*zHw)&v@%sD(k1l|m3S#*td$>8T|OQ04HFA2fpi)eD*| zPJxa<80slNb3eGifGG!;4B#rjNKYXx5wrvb<P6Z{6?D;|0!R>UNk$@QE-$sH7+OU^ zo2szBQPpCstuLr{NbvwmxdYbtg68L<jSLJ7ewti}rclvzPyq)jor>0jSfJ)c(JWBo zhbI)0%fO2hiaJ3;oFSD3(8UVOMLR$u{3S)1sVVWW!l1Zl3&;>~Q3)mx<t5he-~pv& zaJ9t)X#=q^gUU_NS{yz`0nnlZ(Ae4$1_p*ICr2k|7gslT4^J;|A74NJfWV;OkkGL3 zh{&kKq~w&;wDgS3tn8fJy!?W~qT-U$vhs?`Dg#3!V-r&|a|=sdz4$tK&l1$00?k)} ztG*MU@)zEws@PP*n8H-TRKwWJ*bG{#vj8*-U&AB`A7iU!E@7%+Ze|3J+phwZy$czN zR#gg>u#~XYFsHCKGc_}U7Yr+~FqE)ma}||9az+Vz3R?}c7z1b;6_S@~SV}mu*@|Y= zuz>oppyd!L?4a^R9Mp|tvSBFP1zFH0$p9CT!W0Q-Na0w(37Yc{X3*rUS`nJ3n_8Tl zSOA)styCyTElLJ0VuK37)*pg8a0-bEp+TNVtLgJV^Ru8KYH;QNWgXB2d{HrUy;)9b zVi{<FJ10j0rcg&AGbblCJuwH|yaNs6I|e&@dP4dxkiH6hz#F}${>7*YZg@e)7C;Mh zUV>`QDplx$a$HWgQczbdR`<KbpveVopcR4U_rZngE%waf#GJg++*{1a8AafUNXYaL zsFt|J7wQ+}8tfVr=IRn3>>5&32&$S`L91>uZ-E+PCB?TGGjB0w++s{duZe`9!z1yf z@IW#JrCrdPH3l{=MiEBPvKS^tAy8?|#K9=VB*Y}bSacC*sSH~130kz6!c@ytDNw=y zS<ne;$M-UU%T&;!N)u?xVF1-XDa;_52nJ}$x+W+UGG_uBkB7FTLxVhF#UN;*B4|Pb zyrKfMogfu7$()K%s8EtolwX>j0h+#tdQKlSW|XRsT$!Acs!);-P6erX#id1{E?{B_ zXdE=NSRt(xG;sndEkXMzGK))6^Gb3mq4PaZ>(S%7N<>jvMO95*LsLszN8ifY*4`mH zwysK8QCS6DP?PZ%OL1aaDrgBXX#EU042wYVr^#G&22|z<f~3LYsPWL$eM<x`1R8XO zilWCMH>m!}FG-CrEz0x-MIN{k<zN9V_hS)Y<YOti3W_dRBMoFZXzT@CNaP?@qL2kU z3z<NjFHqsIfF*@_A*hwiT+33z02xkLz+A#w!UkGl*UY$(5vrCIAq!e@3lXhhbzrDv z11+|3V5ngO@v=dyS6QmwgS*x6I84mR$uBQfsLU?~jYlPe7GZ<dS0v^scm^mWrRL=4 zrGp1q5*6}NOF+|F3dN;Kd8s9kO3Sq(F}ENm)e1W0R19A94bq=kpkS+DXlbNpXl9{j zsAmYt$f+eLq6Yd#Cg9Wn?ni+L$V5%Cf?HxvF=U+w5#|^e=z&cF8wE=upcMmPfhs0j zA4pkH0Lqu_;O0?ja>*?=&?cDV>|1Qb`N`R-CAT;;^HNLV6HD^*Ao-s!CBLL3H6=bT zwInyOI2)YnHQ8@5Wft6G&Py%1#g<u+n37U-i#;#31k7Mb$}A}cb3y9C3{ZffrxziR z;?&~e_{=<z*&rpL<(`n02^?aKe2j98QjA59K#2y{@&Y9uQ0pF?Xw<-MOi(+ihCzbC zjv<9fg29oYmJyT;N<eF`SZWv-GJ%%5X|h%|IzwhviWNYPf;3q4D=I*1a&r?)KyhAC zQK5%~(IPf84Wco#Si#5yJ`V?vZzEGvJs38CXobZ9tRa&FY9Rlw|6k9{04|tcf>sq( zG1+-)vJ~9_Wjsj0=au9q7F`4JSqc)9vq8IcKrSx2k6H5<-2#b$vKpw}&A=|g2o{0Y z!=O-uXED%ReI*|#Y(OJx;N{<-CF=}XppsApQWAoCE)kH0fy`B6;A8{y1w0+Og=jK^ z-CJ}M<VaR<4@Q&m7AK^&9iLf%9?|@n#qpU1WhU{^2(JaX7}OAAU;!<86kudyECOv4 zgS#6P%W!vtrZ!+*=M<)FrlN*QF;Ho~fC)5811cn%8BsPPSwQ^)UfK)pe=rn#)qvU) zEJc2xMY5F=B`gbAK}+|+Ca_8}fK~v6GZeP4FqE)lf!Y)`$Y$iRfOLVn;F|1JVc<{+ zOD(EYD9!}sc?C#W0bQ4#oS9MtOH-M73VHeQ;EgE?Wr;<Zpq)Ty1vorZi$IwYoGjdm zKugZRIW<I+{T6F-era9_IMac%Bc#3sr5AAc7d;1MW~N(w(9nk#PDRf^DFfU@1QXzP zB5!6fXjUXMB_8C;4p1yW>Q_ES@Um1!&=?sD6BDBZsNciH!dUbMl=ncf0qXUD(io^! z2kupa#&*GdI!;hex=0DSx{(1gdJE#!FxW6uaiuVVdUK#Yb`4XJUkx+37w!U)w`IuV zs$qt(Z5SfJ{cugDs&m1q;JHr)q#Z8s@KaDv%`1xs&3UMU@+@d!S!t>|B*O)RmNOI- zrIuypmli{28FdsYGgEU?bil=KNk%GY9JjaxG#Cr&Frlhd086AOWI~p`ffNvM0W>l_ z)4*%QN>kNA6P%z4M;(Qfe9%l&MrK|*sG<c8|J-7SnpU(96lE;8IAA`3j85@_r&8jf zt0`}B=I5k<VyhHm%#$0mcmitH0#GD^=k7Q_qftDJpoR9JCO&9UebGnc=mSL^DAR$9 zP94y$7seE(76woa3)+tdUh6Ic+NB4|PS9>TOASjFBUr{Lg*6y7dv_y+Erq>>0km)? zg#)y^WC3#u*Fr`Y(5^nl60rJa#-b?|RW+ccIXbnhC9E~9&5T72pxQc%v4$12ZXRS- zVG_vf8qh?05`-Vlkmmvtt7WTU$zm_sP{WqOy?_J6UI-crV5?9An<-bz4pOy%vxa>k zWATL=HVCU|8`zX>;S42QDJ(V2%}o7fj0}~0CEOs@&5X4i;S718E(1>qZx(n@%>>3G zA!s(|spWul8NwM-m;)Jt7$O*IK>KJkKxU@!1T$#zR{4N4KCHi8o{?ITky@lso(kX1 z1>RK(-nRu>Pn}-`N&wIlf>DUVi#kvd4a!)-prI-ma4QJ5gt<Tplr=!hnL)$A;A)J~ zPm=|*s`f1?e}fXzE!NV4g47~S##@Zp=mjr_O-^ENQc9xTK2S0N<>4xI$ov6pqa3Jk z%1kZRgKS1Dw$p>@@VmtUE4xDAjs=wjAY2S`ENJGah9Q;@G)`W`R0GcEg-j`+&0dUt zV3%kz-D1)+fGnE_mqK6yR22Q<v`J6RORXp<vO5oQ8pu!<hAIt0j)Q6X#i&qp9K13` zr;6FCy4FpTAF^kF1GK*mR62k=<d6arRJDLhGH_Gk77J)=PEk0h?&3(zODP5|7y#!K z@W!^HL!f{K6|c8A(i1Zwl^bVKJV^8_NDn7ya1s=3mA80cArzljlnx$~E>2Ck#Q~O# z&n&pb2XYLwA)Q}T0uG2<Y>+K~-~fUUpa8igiq-4eK!F3=1;oGs+9m*+n&)8RVq#%p zVUYok$#F39FtRanF>^7oF|siVFmW-8F>^5SfVUEeF^Vv;F|sffu`n_)fLd0d1i%0Z zYUuV}Q1K7S>Y$Rmm#Ih~lOdR)gt3_cI@ruy<%pE%6%xV2#-MpeXz2r5xCTq`Xek{u zM*!BV$yfvmH$P2?JBoNgg&z|lKp|lOPZ_s_LE#HEA6$24rWSt&1p}zr$H2w|@(?Ss zhd|;W3@+C|gK;&C1#Fq%W*}(sDX4nN0u4TL6zSD~26>sXK)a8bQkX#fhG2#orYvUA z^h*s>7Na<X#{yxeFr~B9GN*v{8_R*GdBi{iz~J%th#JNkR!Ii%PN4|UP9gAM+}hyO z9MJx-L~xi?f|>!~&SPm&4tR%VVnIPpW-@Xs06aqh+Js}J09vnBS_IlI2AbsqtuO#p zK%g#FYH<lTB%yORpyZXAT5P4@2#yZ;M2tdlaz-j>g<O6SoC)ehf)XLP=K|7LsSq0E z16la&cZ)eOC#Q<pN?*T<Eios@N?%`-1)PhDet}XuxNu>E7^=wzj<8$oATvNa>7hID zONwuCfrKhS3u%jQv4Yv4X}kOiun>CW@)UzZ2pq4K|3R?|D)JcEKna_RQG}U~kp;Xp z7c{^O5@Ta3;$>uD_{9%d{-g^Hj$(L;1S&p3&1!JugZi5(j5Q1;3~5YapmK<*${!qZ zkU|?iP^?e{nw<nKl?MeiD40`H(-KQ_N<ho+iWCylQ}asDk~6FgU&X3gtgl+E$yfxk zRg)3C3IW}hLQv!4LA#vd!Ny54GcXi`vK|9l5kDyPg7YGjfTvzab_8X>6vhSM6bd>U zB!zVj3ut?>CR>#y*gLS=1Qr^4#U(|h$t9&lsl|F&4io_EsbbPm0CgqOt1=62v8SY_ z<s_D*RxxYoYgKV&r=}L@Cgx<8rE0QNafKGA7U?>I!k~)ZF*!N4phVXdw3t3KFZ~u9 zMBo;ebADbPWc8~ibCEbGxqy5H9`Qj64MeWyhXo0AB1Z`n9-!6;s0#p!b0)?j5m2~* zA`}!XD6N%C&_%!C2?d4)44?sX&_cXoDbSK#(2yc1v}za@f(8^9)iPI#)G#jqEd*v+ z$P~j=%Tmh<-RlZEs~`?i=Yxh4nHWHFkeWY*t%e1(4rw7{CSxsIML-QJ$OKT!Cf2Ez zy;7)#eF0Mn2Y4KUqZYJR57c=AnYRpLUI28D9;mAVa$gNw4F|-fHVlPTpye|QSU{V9 z7#RvRKs@kZ;vRU)1g*OSm8{^^St$xRnR(d?(69oRCZI|h(#i$zVfD$(%eGRm0Uh9A zrLU)_r=M1opI4%nRgju)XRT0_nqvzVuvP%g(%C9y<|d}6>VssJbfB8Rx<K;-$eKWW zYYZ(Adts>#<WfkIVpdRBs$$Vm(6WKd^@7qjxLO7m7FDb^b_(iB;0a$%R`Bd!5oiqn zq*4Yi8V3z}YjQ%GzpNlH7vJKAP7#3G!9~Tln9CA#z@`;}CJI4o%k#2}K-=nyR)P{8 zIDvr)a3v}P4n63UZ9LdOJy1de4HPhNuz)w<fo2Vb7?~JF82K0lnE03k7$KvI983~S zd`v}>pyGy+p$OC-124dO3Cig3@&?2KHP^u9%?0qtHfS3vXjB>04gxjUN*J=3(m+$W z3ZPyisAh%C?3XZPffmJ?ftr+HQScJD5{4|65{4{Ru#TV<c2FaG0b2=Z%>ZasJ4ZHC zQ3mL6iW;UAwrr-NIbfZPDQvCGk_;sv*|roeke(Fo6lBpkphhdGF`vy;bOx*kyn3O8 zGn=VsM+z@Y2gu!Eu`?-r!I1tJf0ZaWc45&CEBX9hg8W^@R$7v#Yiv{`&B(w|#R=kA z=oV+DgM$hpX=n!SyH>G+B_V1I&2*De!M$5JKPMH!G&a&rLNIeuHMxqmg4$U;PX4~} zp&@R@M)5wbw~%;FuD3X#au#rLLo;MmhGy|ju0^jv#<0fcmFDDt4nZl+$uWY`#+uBx zSW*&85^u2;gU9V|ae`DqdfMRR1SY^~3c4dPt2jR|zO*DQ5|o~_KqVAAXg@OxqYxtt zqXZ+Q!U7d!AifZ2TPLFcBWV7Rg{epbRIq_E2S^)eTmv-p2~I(vy`hlyS2I%#8)#(- zs6eV^t7WfYE>@{wsbOYfs09ssGS)EFFxRluu-35Eu&1$ss{_WWRqo(Tyr6joAILld zXx%($xlv*zsP_R`;GYO>4(KQp6r~oVg7%PQzy_)z)jMRW-vzcj5}E};tByev5qTw0 z10d_lLG@*R9{d2I6a~;`vpj{wqV!Twdk{y(smTOsTJVFKe;nW}eTyqEwLBi;f+BWC z28JTgic;{7K1gn7Ei6qfs=URK23iG_npc8Uvw)*U0_q>A8S$BE@p-AKDXA%yphyA* zGy|I$E9lsdB2a%9B@=_{7jP87_R)fRy_FIrj5Ul|OwEj7nz@-VjR|}bgA8b3s05Tr zxr%Hc<vpk_g47%}pz&m;s%ltdfLd{&P6c?kHFRfkW_})MKSn`*UTR(mXjc+s10$$; z2w&n2S$G3oQ3Gl^fch~ypt*(e{36&1A+T(zQCw1_Q(RI6S&*&C1SxkxeIiXZNJxWP zL$^3!=G@|d8B`PpDmg*j98G3$JQOi7GBDg?0c}`D4`D%2V;m#_nPx35%IN|HEy!pF zHV*Jekq{#nQ;`8^r2r^u<6?rN<6??p@?y1AYT{I?_|XL5aR4ez;Bk-!E=VEkU`iNj zm`XtBhe(t#)iUR?lrYyaS4!0|FJJ-Hs>LQHte`16$TVL#L!K6N5-<T0E1-Rppvk@x z_8O*U#x#`aKu~e4$x?MSEVT%9P6}wgCb0xs$wEepK*KknJtE*mf#n&Q$r%cuHN$!8 zkTV|=p(8_}Lm@yd$MTHKlGNgY#N<@aep$$ny#mIx9%zsW6zQN@b<nJQN@@zYfQ8iV z3YmGJP1TwCd9aKF=@UR?trWnCLI*U556X9t^@9o;;FJMzGjxG-l{su$58WLgx4~Qt zacpKD)Yn!Ds>M}y;Ejaf&I-g*g=*DekW8&YE@<a(5@Z*6WkD)vxfsYa@XARYZ~>!Q z?5D{A*%}6l&07-j&OWY=e(@fzjxMf2@j<Tct`YH0ks+?P#IeZ)hXfTFfRdvmhybO@ zTP&dFhbBwWB9I7p0Xt|T*)8URM2!3|3LbfdRrlZ%vocF6=Yvuxcu0($gNcigjfsVk z3ADW)vSP&)R2DOW3StHZ22eQ+!r+3y4LtY)>N3W#f%b}n%H3L4(9}_}QVnwr6J+Hd zbQcNJLMG4#`&#f!Hmqz;VS$#+tX1LQC`K+3ARDMa8D0Tap1}qs(F+RDCNfxRKwAv) zi_rmGjY8IngR?s`IJ@6sD*~TWPz1__n(UB_jipd6(gGE<+8_d4$AJlOY06t#l#`MQ zavLbaZvllOxPi_l!VD@x1(=FJJ9FR}7*wBuq8uD{3DB?ub+l8U#}TA3WpfsVfX+n9 zVlDw~at^8Ft6{8R$YO2=A3jqU!@>ZX!~-2=Q4|2pzU(Q?koo(<m<WbEjuQ4177!n_ zSWc6*D$O^)401SuLP0+G3?T(jixo5woLN$=P?VaSUzC!X0@~$O1UiIE0d{B!I5vv& zK{Kq$u-(#$DUfX*p!K#zsVSMDqg@~sA^1cTzbb3TJO%Lhk3xPj_!N{B(6&9$2r}rn zHBbQn?SLsH<)=V;`*3rrv_ruMe}S9^Ii3x+fEbHnO^zba{3mF4Z%QRNGu`5g2bqaD zbVU%98^A|ffX;3yk_OeHOt%C;6<}gfYDzrRCAT=i+CT@%pcm!b5NCkRJqn6kK2RoL z;bRnG1Wm#SF$ypj*@8}oV|3F5A<#N1J`g_<biz+cesX*~q+!MdULILdl9QQK1gbnC z<B|Fx2ZDypAX8V&#g)ZHpurf(N*K@@JaCU0QcZyh|6Ba=;26wH%!vn|;#CA%H3C}g zmJ7=2pgu8Ve+wvsf|EFS3pDs75b%cQB2X;^9!`P`+<_8)kpRdU;J^YMp$0kL3RD&p zf%d0@78!$1;VTBOdcVbm=r)79u%NR^K;2!?8HnHs@gi`k1nQK71H1?{=W&Y_ymj-I zn2W2MW2jF^yt8AxQ>dSdk86B@V~9r-FHAhZKPV*l7Dqu&VhO0!1|K9=1X`5<KG+6) zum|`s3-GZ4MWF51MXeymgEqQ>H{F0YYk)T-fS1^VS1m&pQi4|#ftKDCfmWpzftK&w z;!G>buS(4;PAw@q4KfC_G6Fo`4j%LbPYZ(Q*uVp!xA>rOn46fFn4Ve$8U6$f6BdDn z*1%&f;9&}IpB&sLy2S=wgOpmN1S&d|L4*p30JUwwtt)UFplAljZbOiS5r_blw%}p| zoV1XVB%;{iu*n4<NNEQuOo~B!msprULq8apiHDH~gc)5}K<BebFtadmFmW;SFmtGL z@NjT)*m4<jaBwJaNOH(<C~zoqNpkRWaC3-oNOFjB2yt+6s4{^LT#?`q1B-KWNbreq j*mCi3NO5s;@NlSsmho~hb0}~KatLxUaxrs=atHzd9=R(6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..c30e7c9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.exceptions import ClosedPoolError +from pip._vendor.urllib3.exceptions import ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import MaxRetryError +from pip._vendor.urllib3.exceptions import NewConnectionError +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ProtocolError +from pip._vendor.urllib3.exceptions import ReadTimeoutError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.exceptions import ResponseError +from pip._vendor.urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) +from .auth import _basic_auth_str + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session <Session>` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response <requests.Response>` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` + + :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request <Request>`. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response <Response>` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + <Response [200]> + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..6a86893 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +# try: +# import simplejson as json +# except (ImportError, SyntaxError): +# # simplejson does not support Python 3.2, it throws a SyntaxError +# # because of u'...' Unicode literals. +import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from collections import Callable, Mapping, MutableMapping, OrderedDict + + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..3c3072b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +from pip._vendor import idna +from pip._vendor import urllib3 +from pip._vendor import chardet + +from . import __version__ as requests_version + +try: + from pip._vendor.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..0839957 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,953 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request <Request>` object. + + Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + <PreparedRequest [GET]> + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '<Request [%s]>' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request <Request>` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + <PreparedRequest [GET]> + + >>> s = requests.Session() + >>> s.send(r) + <Response [200]> + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '<PreparedRequest [%s]>' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response <Response>` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response <Response>` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '<Response [%s]>' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.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. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://httpbin.org/get') + <Response [200]> + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request <Request>` sent from this + #: :class:`Session <Session>`. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request <Request>`. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request <Request>`. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request <Request>`. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request <Request>` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request <Request>`, prepares it and sends it. + Returns :class:`Response <Response>` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from .compat import OrderedDict, Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '<lookup \'%s\'>' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '<local>' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '<local>': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) + pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## 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. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/six.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/six.py @@ -0,0 +1,952 @@ +# Copyright (c) 2010-2018 Benjamin Peterson +# +# 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. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.12.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b80cb83a02bdc86a9e69bb07e6219b46a8ba391 GIT binary patch literal 2124 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 A`~Uy| literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb35f9c32d112288027a7ef7d330f80e4cedeff5 GIT binary patch literal 10688 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 be2ij@OpF4Ie2gL-JfKk{W)5aHW&tk%b1K$U literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..144070ed4cddf5f23982f9f62b2c2c93226e46f9 GIT binary patch literal 10157 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd2d569fb604df5a249c58ac1e1ac070639406af GIT binary patch literal 23662 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f99062c3346d38a87844f6c380dbd3521ea78e1 GIT binary patch literal 10409 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6bdee1636adababa2197555ac7c5ef2525b0857 GIT binary patch literal 5877 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 BKP3PF literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e4ddb7415d2c16be0ebdd75413245239e8de717 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a57a472932598873c8c9b168c3d745af3e4d91d GIT binary patch literal 12729 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 ZW0B!u<}l-86kuUu<X{n~XDAd12LPtj@Vfv2 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b24b00937f512d8d2fedfb08d6b8e9e0c2c84e5d GIT binary patch literal 5591 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 a-Quu;c+(Cvgjx*hu=6nSF!C_7F#`bgmuZIp literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cc120a090597ecf2046507b424b222010681cd4 GIT binary patch literal 18756 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 BTXz5e literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.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. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] <https://github.com/shazow/urllib3/issues/651> + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..062b4b0d3b96d0fb4066a416327c5c014ac12734 GIT binary patch literal 208 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKmHGum znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI(l0H_$;nJI)=$pQD=ErM(vOeN c%*!l^kJl@xyv1RYo1apelWGTYQZdNc0B}7vKL7v# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e3811d287e5792427ff4292ffe0292be922e781 GIT binary patch literal 1104 zcmZ?b<>g{vU|`Vf?~FOi#K7<v#DQTZ1_lNP1_p*=3kC*;6ox2<6vh;$9L6Zd6y_9` z7KSLM6xI~B7KSM16!sL37KSL66wVZ`7KSL+6z&wB7KSLc6sBMXP2MUeu8@q(VujrN zl+v73g@U5|vdom!Vujq)#JpmKl6-}f)RNTX5`~hCR0YR^0tMH+^vt|eh19&V%%c3f z+|;}hJ+7A^H~A%lNEl{hU|?_txlV|IfuV$<nV~?Sgb_?KH8TV=Xfpa~GT#!)ERN5~ zPfpB<Pb?@%1si-zFta$mpeR2DNk|MsC_c9=w|FH(5i0`&g!t90Ur>};mRORiUzS*; zpO&AKl3G-(Z)B`*Y-VOwZc$=sUYr-7VquhPnPO>bVr*J&U|?X7UZ5YMUyxa#o0(T! zl9-dDYhjR^osn&n0}=$|__EZzl>8$7(xRN4%p_y|<ovvnqRb?HgzMs=A)!}Ld5b5r z7$Ly{@;w_UJQ&#+*%*u185kI_2N54Mi1K+rLBs<M9wxAkA{Lkz5uPmqnR-hE*|PZJ z#JrTG{0fj!#h{eIz*q!w0E&gousD$br5MH%hAhTxwtTS^CJ-xyS&|`}Eto-*#qXA& zV?cnbpS!1@YkW|sUx=r#YZZ@6YFTPdegP=L^>6V9y9R~12E_;ayM=^12Dxf7-D1iw zzQqm=3nZt4V+iElB9N;<iJ=(eBL+q;Mz9EW2Pz;tP!8FF`En&p%?#i$V(}~DWME*Z z5^~SaPtQS4o%%(fY@^9s#0?5O9uNVt6sxm9fg+BGDlSGo#v+gyio-y<ky3LO;{qm7 zZd=Hd!ki7tMJ#?%Z0?S(@nODhw^&MwN>h>TzQvrLT7uPXkg>8LyFp>YzzB|OP4-*t z@$o77$?@?J=Y!G>I4;5A1$G-)AvP0laoFU7^RXSs3&kLxvoLWmbFgu+aIkW)0RTt^ B=hy%M literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfc3fc7a36a32dde8c8a9c1b31b25b78fa32b6d2 GIT binary patch literal 8323 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfb9109b611ee45b532d3772d9da9b37ec9ce921 GIT binary patch literal 3250 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 QP++n!@-Xp0Ff#`;0Lck`W&i*H literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7317ee744adf2ce921ea2d022cfe720029253ac GIT binary patch literal 14486 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 TA{=TQCIWSAj65K5W`Q68AMC+? literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe90387dd044a2c720cd57b661303be19a5167c3 GIT binary patch literal 17905 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 MHbx#6E;cr10D8w<qyPW_ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be68c52521de6df6a6acc0bc37939943e98cd7f GIT binary patch literal 4914 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 Y5?~f!763&tRF;cbz)grnfJJ}>0D8V5W&i*H literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4419000fa449b308e0b3a5ee538d0b7195ccce1f GIT binary patch literal 225 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKUHSz@ znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI(l0H_$;nJI)=$pQD=ErM(vL4r tO)f1;Eh$ROD=x?{D$$RR&&<m#iI3MSsJz8tlbfGXnv-e=a$_;b9{`mIJyHMw literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8239ec92f79ede08f6e0cc6c712415bdc3fdb5d9 GIT binary patch literal 10320 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..293d099902d80f3ba991062f0ece1e4901edea72 GIT binary patch literal 7501 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + 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 absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..9b42952 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + +Example usage:: + + from pip._vendor.urllib3 import PoolManager + from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations <https://cloud.google.com/appengine/docs/python/\ +urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + <https://cloud.google.com/appengine/docs/python/sockets/\ + #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..363667c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + from pip._vendor import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when performing security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..526c41014464cf71193506f5e7e8b9090f1b2a59 GIT binary patch literal 322 zcmZ?b<>g{vU|`Vf?~KW1U|@I*;=nKy0|SEt0|P^`0s{j>3PTEG4nr<u6eA-;3R4Pm z4pT036f+}33Ud@o3QI79ChJR(K2643{E11$`8lN}sqvY)1^GoKFBw4=Fy0a>F3yS1 zO)N>yh|kC`F3C&GP4&}cy~PzDpH^B@T9g_eUj(x87DEvW0|Ub?_W1b3oSgXhl?+83 z3=9zBSCxK2QD#|UNveKXVv&AYeojhiQL(;}vA(gHnOV6-iKTgQUVMs$QLbf*rKyRr zX}N)cfkAqKeu#cSW`S;IUU5lcPL8gHL2h<Nwowj95RBu?Qu9*si}Xv2a&j`0jP(l= qld}`kQ;YTE<1_OzOXB183My}L*yQG?l;)(`f&5bpaw88D4-)`a30M38 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd7ddaa4dc0e3de7be9ff674f0f7caf313362e0 GIT binary patch literal 24410 zcmZ?b<>g{vU|`Vf?~IvL%E0g##DQT)1_lNP1_p-WEItN?6ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k^MiUmxwMzMlvwkS3*%^t;`!V<-i!WzYy%9h2I!YIj*!j{bx#SQ1N zXER0dKzJ!^txS>(DID3XQM{=<MN?Aw(io%oQw7o(qXbih(io$JQ~9DqQbnW0QrWV^ zqa^a`QY9fOQl-+EKx$Iiv!v6QqJ&drqC`^p!0Kcd$fa;DWGp(BDv-j}%ort+=i$zf z!kxm?!jQs~D&Nc;rBKP2s+g+K%+Sop$PmtuC&$8&s+7$&fw72<kpTo@IwKkKxFQ%* z1yXoH=0q!`@TKs#FhnV*2&4$MFhr@iGo%Qm2)8h#2!qX4b!SKsNfB*fND)m{ZDx*A zb7x2qOA&8jND)tE&r)w@j?!>vNRdd9Y+*=|1gp?=XGoDsk#1o~kp`Qfm8zAh-OL!J z<Ia#GlOo%~kRqF^(aapBo2r>2mm-%UpQ6yrlB$`an4*-ToT8GV*vy)$nWCDal%kZP zmZA#gsi$b9D5q$qsDpW0DH<u-&CIEqDLP<1x+ywfalI7%6#W!~6g@D{5X{p{F$D9B zz$O@{7=d{vDH^G~6PSubQcUxhQp{4!!7i{!(MYibn`@O~onn(>3l>#KQAm*oi`u2w zrPza64k->$mSc(|lx2)!gA>?g&M8h{`&_`jaZPb)W=&N~QBKilW=d5{aZ7Or(;g|F zVA?CiJH@A&IaMviH^nc-7tHcc2}lV9vw~8BQ$oP3(3G&0a4;((B{C%n%!*ElNr?rs z;!@&M62Pp)l%$koFe@b`H6;zqN>9m1$po{qQnFIA!K|E=94IR{B^S!dOUX;g2g??u z6oOq>lu`_)OHxX~bXiJyN*P#1MM@=Dq$;I4r3Nfgn^Koj4`wx_G^R9xS<NXeDXm~u zTS|LM2bk5F(v{K;X7!}>ru2bX{V5YtCW2X$QYNQN0kfv2OiP:>M2{n0E%IuUm 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45d5bd4a0a02686247735b7985a446633be9135f GIT binary patch literal 219 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKE&2sT znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmZosFpe)v%}dEI(l0H_$;nJI)-Om*&Q45EE!Iy; nOwKOIFDfb4kB`sH%PfhH*DI*J#bJ}1pHiBWY6o&%F~|o122(na literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4acebce0545a28e1fe821290a19469c8735c75dc GIT binary patch literal 1313 zcmZ?b<>g{vU|`Vf?~K{N%E0g##DQT}1_lNP1_p*=H3kNT6ox2<6vh;$9L6Zd6vh<h z9Hw06C}u{66!sL>6t)(|D3%naU<OT&s<~WAiOJao`9&qgdbx?&scD%xsa$m!fQ!os zrc9wEBUK@wvLquvPr+CrA)z=wIXkrkt~nt=Avd)oBR@qUEx$;iv^Z6vJhLQ2Au+GA zBqK8~U7;i+v4pEUF|VXpp(I}+xhOTUBvm0%K`AXUJ5@;mVwggHQdVkmi5}NWkmvj~ z8E<g}gKhEjzr|RT%mxx=U|`^7U|;~Tok6}9U}Rt@VW?qj2KkpMg*k&co3U7-gfWGs zhB1v%jG>vai7|z#hB2G1mMw)5L>HLUu<<a|ve&Q|JJqliJC!gsF{UtsWNJB5SZg_J z*o&fSI8zwS8EQFe*ox9>I8&HF>=Nc0h8oUhrdqBV1{Q`amJ~K~1}27hmKvrM_H2%# zt`v@1rW&Rc&TNLF86~V)Y)~Fk(S{n1;x#3VDO@18)Nlne)UX$ws9`HQQNp@_y@soX ztA=SIb1iqCS`B;AtrFG+9AFWqTJAiN8n)s`AorE9F5rZT)^HSktKkl2C}CZ|Rl{Aw zT*Fesx{#%or-reHC!V{8CzwH#yUL17K|w(Q7I_N!X;@<{ttdYi9;bSydSFdO%nS?+ zw;0QBF(y^1W#*M7=47TQ<mRWODySAIXyoVRR4NqdD3t3cBq=23<m8v9rfA+`c*)4X zz~J}t|NsC0i$KgO#nQZ_(zLYHqSO?H;*z4&#N1+q+|uF_g``x4q|Cg;qDoDkTg=6& zCAYZ35_3vZU5kqHi*E5b78j=$m1O4Uf%!#D3=9lWeDSap8ef!}R(y*oGyj&bi>sSs zs82||Q>dGpYfyZ!XO!zLJ}0P+LE!<3nMFwa)WnojBz|~NW=U$%E#8pSiV{!%@S?<m zg4Cj0EFe#6^4?-8PR&Ux5(0$+C&Uk#dFi(}QuC7YQ$Q@XRFGSXZ?Wg4mgi*VrQTvM zFUl+d$*>otCPI`zym*VfD6t%5>MiD?#PVBg5Yuk4l%!UatYj#XXJBCX)uLZelv$Qo zlB!>pSfrnppOcbWRIG1gtZ!^)W>#)dVrgES7oTEblxvw{X=-9@T5e!qV31y*AEIB7 zS)iMlS6q^qlcQ^4kei*6ZIlBN1mpO!)V!4ZBK^{$oSe)gWBr1}<m|-s)M9;jzSoC^ zs$N0mEkT$tJgoUZxyuQZ<yeInnHYJPI2idDc^EkuSr}QsBnKlGBOjE-2BkqV0*ow- zd`ujSJYbaqjBJcWilD-a6`ZjA{QUehS#Pn&$EV~c$Hy1(fP$F~lK;Wc4OR>e8YDsi cq>95PH$SB`C)JJv<TMb$!pOnI!_2@40Juke$^ZZW literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..740db37 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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 absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c2ab5ac3f71042acf04e6ba77bb918de423c861 GIT binary patch literal 563 zcmZ?b<>g{vU|`Vf?~K{N#K7<v#DQUM1_lNP1_p-WHU<WU6owSW9EK={O0`smEXEY3 zY=$D4RHhW>X2vGQ6owR*9Ohh>D3)B-C{{*>aE3fT7KT)&Y_6gjMg|b96alMYLs6pw zRZ|91!N`!pn!=L9j!+TFkjE6k03lOYqBv3*gBdj0UV>cbr^)n^nSp`fB`X61LzSdk zVopv{Vsf@ZNxni^YF<iyQEG}pa(+sxCetke=hUK-%(Tqp#FA9kqN4nwTYR~RCCM4_ z8TrK}d5O8HFBw7p=e)&STv>dJr!2LoI5R&lJ~J;Z{}#7rZb5!g2}B!nadA!&3j+f~ z5y;Xg8IXk_*<!uo;+%L?Go$$9Gjj`aQgc)DN)k&l^Yd=8$Hyn;<iy9XWGLbRnE@hx z_39TCWtJtDr0SO?7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut z7^D~Ihv*k%7U*W?6_+ID<mg%$<Ys4N8|8om!8jfg2KuE%IXRh0#`*<`$=QkNsm1!3 z4%Ls3&&<m#iI3MSsJz8tlbfGXnv-e=3Xx(F1_lNWCMISsMh+$sMm|O+5XmIN3;>LW Bn%4jT literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96134ae43373096584441112342f7e43914d1268 GIT binary patch literal 3322 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 QTudy?0xVpn9IPBX0QJO#9smFU literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..970cf65 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used in Python 2.7. +try: + from pip._vendor import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +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 + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = 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 _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +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") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + 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") diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw['request_url'] = url + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78fbe9bb7d7c4c07920b31963e3365a1846c32cf GIT binary patch literal 1000 zcmZ?b<>g{vU|`Vf?~D;)VPJR+;=nKy0|SEt0|P_x5(Wl_6owSW9EM!RC`Lwx6s8pB z9Hw06C}uF5C5I)KHHsC?X3b&CWshP9v)OVuayg?obGf3pa=D|pb9th8a(Sb8bNQn9 za`~h9a|NOV!0Om@1apO=gmQ(Wgu#4{9FbhnC{Zw*Ge;~}JW4!QB1$4xGD<R6DoP40 z&XpsbD-$J?D;p)t$dJMvC6~ez%%I8p66AJG##{V}NyYg&r6sBHnYjh|MI|p8L7rs1 zC7M|rpPZkUmzrFXnV%P*Qj}j%keZ^&c#9`DF*`LrBQ-H4wWt`x&n%8lD~M0d$uCY# z(d4+r6&&p2oS#>cT2XR~-NP|BKG@Im7LR9ed_bgsfU93{u+J?a&*1oASLe_m*N`Ab zzu*A>ppaWaiN(dKMJ4fRnR)4{MFmBfc_p_5i&Bg8bIMZVlR+{?sfES2gkeI(#X0e1 zsYS(^`FXeaL7eiU#De(Z{N(J^5>2LCJjta+MX7lu@g<qLskhieGILY&OG`8vZ?OiY zmK0TLvfScGPc4bh$S*Fr#aWP8RGb=LT9k8(ySN}H6Xb}Z;*wj;p+z~GOt*N;6G1}x zMe#+ci7B`E;N0?}%#u`1ks=NT28JR|5CKXdMeHD!AcznE5uzZ18$|Gf2o?~*1|oz& zgfNI;1ra<Tf)_-HfCxSiAqFDE85kJ+H05t`#mA?WmXsEy#>W?d65K5=MEn$ijJ?HP zlv-GtT3k{DGVm5hQEG8PeqM2E5y-k*ETBMwI1bIhV8<b>2ibg!9TaZ)r6omRM}s_a zi?s+8az!AY-C`~+$|*v40PJFrM{lu!LZ=As?py5f@rgM(@$oAeij+W}0TI8-^b3kI z%Mwdc^~(~A^waWlKuJm8$XMUl%*?FZqQug?I4?fM!YJ1=#nRNo*tFchz`!8AKtDvk zAhSR>Gq1QLF(*gY!XP(0BikqkBnZawWvO{7`9=DrML9W{Nyhr6C7C(;@$s2?nI-Y@ ndIgoYIBatBQ%ZAE?LcX~8035&CLTr*)Zh|e<zbXy6JP@X{ND`O literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b1cfe7eebc25754e3501b4e686ac932040f87ce GIT binary patch literal 3175 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34afe40149d60304333a461285b46947777b6fb0 GIT binary patch literal 1049 zcmZ?b<>g{vU|`Vf?~M7#$iVOz#DQTJ1_lNP1_p*=7X}7~6owSW9EK={6s8pB9L8Lx zC?-Y_n<a-imnDjYks*~Si?v7(tcop)-JKzYHHEE(A%!iKC5x?@If^5NF_=M<{Uyk3 zzn4rPD;aMw7iU&zGTve>EKMy<O$JH9Ff+_*0|o|$RE8+V6ox3K6vh;$7KSM1RF*Wx z6y_9`7RD%6h&54cDeNg6EeuiYDV)I!nq0RyeKOPX1Hs0E>;f4JqCwah<Rd-?28I%b z1&j+BY8c{~QW%06G#ULgnQw6?=jY_4CYNO9=M~>#O-U^*O)UZigC^50mg3Z$v|Ehv zD;bJFLH4Uyzo00yEU_e2zbvsxKP^8eCAFwn-^f_s*v!nV+@i$Nyf`mD#lk4pGR4x= z#Mrdlz`(#Dy+A)izaX<fH#4ueBrzvP*TNt-J0sgD2P6o_@nxxbDfvbErA0Y8nMua_ zr6rj;`rrW4E2zB18lRb$S;7tS0?026j8*(_pX!0-lELB(3=AL|gu(s=xwwY0h9Qfg z859qUewvI>e-&{sFfiO=&PmM!dkaE<EV#uMUs#-3l?n=~Vvs=$j8y_imVqTvYy(9a z*fs$M1_qE_3m9t{7cw$3z`~aaZ09Yu#Dap<ycA6)h}|riC8@a(dqK`D0$a`!Ur<^i zh~!T`B&!QbOOhEuamv8J0HQ&z16vHz53zV5G)kdXG8g0*XflHB!?Y<qwL}DmP3fs6 zewrM&IO5~;5_41I<8N`r$LHp!l;(igJn`{`rHMHZnIawr28JSD5CICYB9PmQgh5=8 zqtGlZVr5`p0EriaLZ5??gPDh!gBdKU$yvk(iV=>2#N_P6^wi=aP_RY`!MJ+GnH74u z`DLlakicXPh%~yz3Qp=#BJrhprNyZ!FeidV!KNbF53&{##vC>fuh@aYuoxuH!N|kN K!^FnK!3+SEF5*1^ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31b50f0ff8eac16cd6e301c0874e57bba4b2cc61 GIT binary patch literal 3230 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4abd998944b91a3f64f9e2efc121d74675ea0107 GIT binary patch literal 1978 zcmZ?b<>g{vU|`Vf?~IY+Vqka-;=nKy0|SEt0|P@bh)7{bVa#F3WsG8EWJqC3Va{R7 zWsYJ2vsrRjbJ?QU7#UJnQ`lM<qS#Z|Q#e`}qBv4GQ@C0fqBv8ygBdh=UV_ZkWW2?n zm{gpfQ(BT5pP5^bUsUoEWRE7}E$)nxl7jf;oXpg`5>3WiLLRA!DXB#PiABYkdFif2 zMfpX^j36Tz7#Kh_2Ll6xGstym3=9mF95oCJ7#1=FGq5m}FlKWV$uKg2U?f8xQv^dL zTMa`N6I{*$B*Vx6mE)>m$YM@m%;td0M<C0Wu%s|GGd3}%Fa|SdGFO#wDJUo?IA^3L zXBR7!XQY;7q!uY8Dx_zYrRFK5W#**n=4584D&!|+r6!jsWELwV=j0csrs#2j^;s1p z7A59_WUat_kXa!ashAo|@)eRncIbhX`BiC#<|QWOq$-r;E2N~Bq!#67=B2`|Pb)yO zNR#yzM`kg^)?0jzB_&0fNu?#J;PAV}1{G&YE4alKmY7ot5!YnA#hjm%wUVKThk=3N zSDAi6QD#|UNveKXVv&AYeojhiQL(;}vA(gHnOV6-iKTgQUVMs$QLbf*rKyRrX}N)c zfkAqKeu#cSW`S;IUU5lcPL8gHL2h<Nwowj95RBu?Qu9*si}Xv2a&j`0jP*-PGIR8c zQi}`n^NLgT3My~$WERJ#fl>e{#MnVmD+P*g4kl&}Mm|P1CMG5}2+hm|ri=I(7#QGb zf|Y@R0ffP6qKtuop@gA^p@cDushO!*u7o*-aREySYYjs)<3dJIe3r1)fYWg^b1fs7 z&62|0%v{Tq!d%N-!&DSk!?1vTAwzLo4O25iElUYQ4ND0}31=EpGf0l5mbr$pIIV`c zsHlXihOve@g|(Ndi7|yam_d^*F@TYQ0UU3R#l@*bB}nNcCr2RzoT`fzG7`&D6_Qd@ z^Aw6plao`6i_=PTaw-)H5{tme1(Y&eD@uwIlS_&fQuC7YOY=%ni&9e*Qb8G^SRt(_ zKUbk7BUPa&wYW5=L?J&7tTi()9cF_bB+2>b<y0z^=NDxcE9B=X1XPw}<mV|ELnWc< z5$Yx@1xS`F1|_qy)S}F^N=W*%Dyb|;g_&!mkO0c4Ihjd%9w8wCzNy8<iRq~cFcXUs zGmBG;6`+x<ms*jWT2PXipI590F&sHRBQk*}!ue1SCKjbCq~(|9r9hlerIcDxkeXbQ znxX)+9cr_VLVA9QLbXAy-Yxc&)U?#(l48GG-07($@db&MIr)hxnoLFf3=9mncuVsj zp&Or)Sdys8eTyrz7@S!1l2dQ7LruNKjpV6YoFSD3kSubGEiJz&H?iav3n(mZv8Sh& zB$kvEfzxbmX--LIL1IzKE!L#UlGNf`%*7=|MWD2($$E<&8n|FL6bUdeFcb-bT*D4^ z9XQKD2wsr5Xd*b##6z^jgIt`Mm#zlS4FWujY>YfiJd8X{EQ~D79E@yCe2gqi9E?SB z$hiSjrZU4yNEHSKh8l(}hFZoF#u~;FP#Tt~VN7AnW(sDgVO+qxkRgQ$#MWf4+5k?t zXyqFuofVd*7K0O7A}G;;bFD%~VlgBUCn|WjI=bi<rGiyK;>;s4FC{0n7@SNCOEbYq zFipX+pujaRJu@#AmSP}fVsd_79wa?LQX81BV3nMcSX^v{lH!7(MMeVHsV_mkyu|{t zU6bV&dwgzcNk)E3kq{^>nKScBZn2gY6r>huGTq{Ul{L56po&1H9a7K>XBNl9)WnzM zgQLJ36!4&`hJllfk&BUou?Q3uewtjjxZ>l}N=r(MQsd)`K%pHaRFIgQotU0ltXG^_ zp_iLqmRelI0*Y^8kXyJAIRTtBz=an$&cG%@oPp*b4x8Nkl+v73J5YUB463L>(ayun IA<v--0000cw*UYD literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b3fbaa760cde4d971cc2032842d3904e76f1ec8 GIT binary patch literal 12664 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bbacc981faf70c0a057a908218040bfe77d2f48 GIT binary patch literal 9556 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 V$05xj&LP0S$Yl#&O2o+J1OS~fI2Zr` literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..437980a07074a7db5a46a85d3ea8c1e552953be0 GIT binary patch literal 8779 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 E0DPPf=>Px# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f84c93ef708699ab38897eecdf15756b138cdc41 GIT binary patch literal 5189 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 A7XSbN literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81736f224f1967af00c00684547b48d9d631473d GIT binary patch literal 3141 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,411 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = remove_headers_on_redirect + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..dfc553f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + from pip._vendor import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from pip._vendor.urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf-8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5.1' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pull”-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Push”-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Push”-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f058513b233bf6f127073b3902c88f38cd5f754 GIT binary patch literal 9684 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6525a70c1b87e0cafdf02d0a94ed9f8063fbf7df GIT binary patch literal 4098 zcmZ?b<>g{vU|`Vf?~D;vW?*;>;=u5A1_lNP1_p-WU5pG2DGX5zDU4vqlmdawDd><T z1s$@cphLD4RLGu!8*-#zhny+cAXf?qa;G3eo)i$|O#wl^6a?f?5r9L%6d@=SPC-DC z6c7|m0YR}8LQp&f1SL|iL&+2nlu7|X=@bx@NdZCG6xkFx3@D$XkfI2ON+}?yoT8kf zf&x`jFriwCT8es#Mv6v?W{TFFYf+3T+QAH(I#t`axD*r=6v|VRQuC7YQ!?|?i}i96 zlTvev!Qyq80HVP+u|NT)Ljj^ep(J0SBqKGmNFgsVH&qX!&MG;-pt2}4J)^`*!5PL> zFfuSSQb?*)2+qvS&r=9aEXd3QTW6J%nVgzeoNA@u6zrm-P@I~o;N$7+>KE*)kd|Mh zkdj)Gn3+?o$Hi5}T3V8(YjKM$Gbz`?%&dwlvp8SZ!ot*2*9eJijKnrUVw)ndk@cD* ziCa|hz|FMK&8*^v^9&7;ImXBw6J(AlGRLfnEjvHcLbnJ?m)_#cO-#<rE6Fd;sNycq z%uC5HFV?j%H>u)*aSV-24N!Q7C_Ez+o-qm!)f7_{IWrWVISS9BimyU9H!)c^xw0rT zCnq!c7IS)1_AU1GBtr`WV}mNLj4IvqBwZt8L!(<PNtx-URcxuH$+}qu5U&~;7#Zni z72M)1&d5wFiO<R`hRA0ZA<1VKRdIkK&(JI>6~@X*1zB8LoLZ!tlA4y8mztt^txB*o zFEcqmB~{l@*H9Ov!vYrTETtuB7Ppu!%*<}FCKrGxj^tuUN+@DvU|_h#om`w*oS&0e zl9`8`9-!>ZB3(lR!z#|q;(SPwxy1oxLKMV9M638Si}RsuD?>{Q^IJ?gMz`1?rXpK` zoXntXuoadFD~#b*KomfXHAb?+7-WUTEv6h}s1?S@Rv@QdC>vyjp#j1Q6Sx%+1rRGt zkgPC)Sz!XT!sM0^BB0<=&H-Z~<pyYu0oiF{g0RyRZYM+m#7<KrJ53>WvLzNJCS@j9 zaU>S!=IfdpSU^1o3Td-cWKQNS0fd`ix>A#K6Lk#@As&O|b2Fs;X{MWs!pnrX9OPOf zbA)Tn;I4&adWdVykX&m9a;^C-euN9si&9gwt2m$zu(-vMnv-7=Z)s$4ixn(&iw#U! zKx_ngM;BU(fNeKJ*lrHD9ijkYyE&5W<`CO?ic9n2Q%mE)2H%1tWst!ZsmMW-k(yML zT7HWSLL*s^T5zR8WI&EFwm>+>0`3@y%OQ@jKyr))$T1eT*vc}COA~XDoso$Y))u;% zx7c&?(=(IdYQXu!43gnN&ek<FK)Asa;&-U{Em#&bG`Pi-V+Ku?D0(5;1)|;<p&qT& z1r`4gH6{o(CQwI%9b}2@AV^|`XfQ=+fE3t}pfEJO#gv1h$?O(;axth3FS^B?ou7G& z1;mDy=0&%_rF%T0bmvYkhL`WRm~#`8i<lS~7^=7-#cNT1Zem^)drCf}$VaMM48dUq zahf5*X@*toC7H##W<~}mmBlT#<N}Op!k~(yLKh+ql}D{O4B_&IReXtg#hLLH#(E~Y zhL&a)w^$R4lQT1++Kj-ZtDz-wI2uB#TtiE+J0V#S;$~e?8Z$sDkPP8z459!Uut;gl z5R}G1#i}7R>J6(nN{e;DZa}G*jNnc-g1Qa0zB7i)8$;z$A|Ddp5XV9t4sxssQiiaE zI~Jk<;#f;0$6A6MYk7+)#}w*V)N0iP?gSI46Hw(%;qs<XdDM#73@&d5l}D|b&EfLq zP<acKAhLkVV^rc*{E$>vnq8EbnU|TEcZ)qaBQr0xIQ14sa&dYRxH^ZFd8QT+u7$xZ zHV6w;`NxA)RB@#zff>3M21U%E#0<*4pjbDxsA8?qO;5@$VgU&wH4=(g!2+O`f^J53 zadL4LdvcyGh<l4Ixfn!)TwMVX5l${nEln=SPD#rx$x19p1UV4We#j~SDTA~$potOG z)Ie``a3vRm8y;Di#kV+ei{rBs^RhClAdL~-tjyvfHc;Dur5MyMfj7B~4YR7)Ds(}D zpbVZ`nw(v9i#NGAyExg@%)k&-??W7sT?9$;;FMzt%J4<0iFs9g*~Rh6@gSwTV6~`x z%UkSFgKlwT7emw`a<HWdEN_9lgS(Z)25S8nn&ECO`DrrUVvmnc$xn`tzs2U`=;Z1X zypo|PnSlX9{3_8eD9S8LEJ@WbODxh)%g;$kEh^SGGS)XXGczl<D6upz&Wlg6Fv_(| zu{1R?HZ3<WFfd3j&=1is$Sly!%quQQ%*oNUFv!i$$TrFW34(EaS!!NNevv+M_dy@h j8_+ALyv1RYo1apelWNBe>MO2cWME)nV`3bILn8zL?2l+D literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fab656d64678fbdbfa58b755f2634c49fce2c74 GIT binary patch literal 1920 zcmZ?b<>g{vU|`Vf?~IXTWng#=;=nKm0|SEt0|P^G8Uq7E3PTh_3S$aW4r3H!r9cW} z3UdxqE^`z!BSSbto&pO)DoZw3kqsjQ2!dr<A+nJSc}x)uDJ&_hEeug?DQqe1EeuiY zsT?UB*-S-Ashp|oDV)uW&5Vo;DNMl(np{<fxVRJ)6cox+lT!1N^HVbO(u?(SvvU%Y zQge#IGIiJhL{m^|dTL%`QDRA|LP<s{su>Uy6ms)ZN^?^6AnL7>^9w4AGSf3ktQ4GK zOa&tYLnDQxN`>Ie-26O+;KYK=Jg~)9Iho0+dBv$#3QoZ;Its<9sR}-x&aQsJt_o@S zMG7gYC5f3i#d=&^FF_&br^$GWy|gGNzaTX)nGqzyz`y{anHd-uoI$}V!oa{#!%)Mp zfMFp+HdC=c31bsu4MQ-4CZnGw(=FDV{PNVITYQei#i>OlnfZCHMMe2VnvA#Dic5+z z^U_x`6tOWdF#IahFDS|^ODsv%FH0=aPs`6qNi8bYH!{{YHZwCTw<xhRFV2fku`tTD zOtCaIF*YqXFfcGkFVGLsFUTy=&CDw<NzBR7wJ^xd&d4^(0SSU}d|7H<N`8?(ay;n6 z;z6&V@)l1b*kSQtXM(&^%mVTxqX1(ODB-}p4Dv3>p&%NPk{Ht&YZ+6RQkYv9N*ER} zmN3;YG&3$>UdXV3C52@n<3dIkhGxcErV`c^))clDh8iXiznQU<p@wk*TRTG<V+wl; zTMGw7d?6zvNSr-|1H?+<T)<JoxR4Q)lKc{d85tOql$0QGjqDLUNMZoTDwfm)(cqg{ zpa4sP3J?tnCHbI)m06^amzYcAL<DxYvO+{egn~=HLSBA}LTXB8i6WP>LP$ntu|isA zPO3s?u|i^LNq%l(NoI0lPEMsldTL%ODEX&=(l1hMadG)LI=T7;E7&SjbHSqq6k(va z3I?S{9|i`7bcPy+SeIJH8pad`Nd^~&ShHHD8m1IRFk7RRxrCvFv4$CxT^BH=FfC*( zVW?qBVU`3%ADExUG?ArHrcj`eC73~z<rXI__=<0_K?3j=W9cmxP}pfQ-(o3BEhqw~ zm0N5%pfp{e$#RQH&)^nEa$-qpdVW#mEe@Cgw^+gY!6_a>u!GV*mrYJ)aY=H1Zh@UH z$Pb`&#>T|N$irAA0}Bd0o1FaQ#GGO~J%r+0tck_RnVIl_0HsY3E(RGQ1<sbSLNQFW zpj60E!`RFi#=yu>$dm%joQ$`ab5ip(nTz-t7#NC#Km-qn09lXZI!+sq8!8Hl?2JI> zGBGePurO3fg9Jfwgyb-g5J(-0gFrqs25HoRI7kKJpcIB0#uUa5h7z#DBp5^(YM9cP z#TcMY1QnvpReYc#RJGVjwOB#5ScmHuqk^9%W05GRq(^r(sF=!4tccG^%|p1oNQ{Aj z!31PE*wu`;7;A4aXmZ|S$tupz0~Jk)DaAz~DNrmXrrcsnNlngANxj9Kn^<v+Ew!Q~ zH815BTVg>0h-S&k&&<<gzQtTxlyi%<AhD>VxCm71fUVPHERq0)9mu!0I6wgb3L8m~ z)u4c75MpCuW0GMOVq{_D0>dIz1_p*(9P#nFiJ5uv@l|>mB_#z``ueb>qE}pynygoz zkyuimu9shw4wop_136xk>lS-_d`f<De0-5K$RxJXqMV$}B#3XgJ#!24i%P&n?JYit zj9yV{VQFe{2{@_3Z3iXd`1o6_1x1;8C19T*5fIPVK<XMhZkT6Sm^c`j7zG&l7=@TQ JSUD6q7y<c4@y7rF literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..495656865994511cb05ca9380a08291fa496b86b GIT binary patch literal 5061 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 DZ(XuB literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2af2110f6938e8e00974615f812098d4bd590121 GIT binary patch literal 2673 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 B4e<Z~ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf-8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATİN1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf-8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__init__.py new file mode 100644 index 0000000..dcfa1d0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3236 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +import ntpath +import posixpath +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +from pkg_resources.extern import six +from pkg_resources.extern.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pkg_resources.extern import appdirs +from pkg_resources.extern import packaging +__import__('pkg_resources.extern.packaging.version') +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + from sysconfig import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet: + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.name + ) + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment: + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.6'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + self._validate_resource_path(resource_name) + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir(''): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent or None, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint: + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + PkgResourcesDeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution: + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..744b9a0ed18d6db17c6c64b1541831ec484c6b6a GIT binary patch literal 98573 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 V;OY+^F-4#? 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 Dz6JYc literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2c6104e9893d505b25f2ec61225c404b8364b9f GIT binary patch literal 646 zcmZ?b<>g{vU|`Vf?~Ku7Vqka-;=nL70|SEt0|P^G0s{j>3PTEG4nq`#W{hG4^O>TU zQkYVhbC`2kqF5LiQaDpsQ`lM<qgYc}ve*iIQrJ_Ove;P|m>IGe^F2~HvKjJNm>3ut zqBv4Hio#M^^H@?DvN)qSQy7C8G`U`a?Dc!e2yzbNE#~6P3b$k?kQf641IQ^LhdP6t z<H5kdP{~)quz<0KVId<ULpVd82@69BQ#MzT6C*<{6C*>FSPf&5K@C$Da|v@6OEz<n zQ4>Qr$mtBVOm$2V43P|ZOc4wz48aVVjDDJ|x0v#aZ*k-%W~ZiP78T!O_YZb0D#|aq z#hO}Fl$U>t&DAx+GdM((`4&q-VoAm=j?{|G;*$9M>|4yK70D|Zig*|p7=D%L7Zhcd zC6=V>mn9bIr{(9Qq!tzH8yV{xo0*xFTa;Lu7w5&NSQzD6rdXPq7@L+G7#J9&7wCuR z7i1RbX66-_B<AGkS{USJXJi}Y=ohD!lopia=jRmb7i6c$7o`^Gmlh?b7V8&O8XG3( z=N2TE=oM7n;)#bjJKork0~9)-U}9ioV&r2KU=(01;sXUI(@RhQzGMNhnTz-t7#NBK zKm;gwH5uJBxr#tiMeGa=47ZqzD~qGpQY%VQi}H#<+Q3HKVh)Hjy2VqLT2!2wpBJB* zmzIBvFE2GUr5NsjB36)*ps)Z32!!AT8OdRjo1apelWGTw+hUN5I2bt?Ihc5uxp>$Z GrI-Nf>zCI6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f7af16b277a9ef7539303d03b6985c5bd33b57e GIT binary patch literal 209 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMKRr&=* znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmhS$sU@WaCHeU|#rg%=>G4IW#rdU0$*INq@nxxb jDfvbE@$s2?nI-Y@dIgoYIBatBQ%ZAE?LclS2Duvm*5EgQ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f5abd96e48602784d8293bef8134e17285aa4fb GIT binary patch literal 20697 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 Dvf@$x literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be7e5970e246823940c5a5bfbe72dd238bd245c8 GIT binary patch literal 203052 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�|6x3L*Jmhm?U=*=B%p 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 UgPDz;gNcoqgNcJth>?v60D99882|tP literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f871af917bed8672fd655948222c9c83cb2e99a GIT binary patch literal 24410 zcmZ?b<>g{vU|`Vf?~IvL%E0g##DQT)1_lNP1_p-WEItN?6ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k^MiUmxwMzMlvwkS3*%^t;`!V<-i!WzYy%9h2I!YIj*!j{bx#SQ1N zXER0dKzJ!^txS>(DID3XQM{=<MN?Aw(io%oQw7o(qXbih(io$JQ~9DqQbnW0QrWV^ zqa^a`QY9fOQl-+EKx$Iiv!v6QqJ&drqC`^p!0Kcd$fa;DWGp(BDv-j}%ort+=i$zf z!kxm?!jQs~D&Nc;rBKP2s+g+K%+Sop$PmtuC&$8&s+7$&fw72<kpTo@IwKkKxFQ%* z1yXoH=0q!`@TKs#FhnV*2&4$MFhr@iGo%Qm2)8h#2!qX4b!SKsNfB*fND)m{ZDx*A zb7x2qOA&8jND)tE&r)w@j?!>vNRdd9Y+*=|1gp?=XGoDsk#1o~kp`Qfm8zAh-OL!J z<Ia#GlOo%~kRqF^(aapBo2r>2mm-%UpQ6yrlB$`an4*-ToT8GV*vy)$nWCDal%kZP zmZA#gsi$b9D5q$qsDpW0DH<u-&CIEqDLP<1x+ywfalI7%6#W!~6g@D{5X{p{F$D9B zz$O@{7=d{vDH^G~6PSubQcUxhQp{4!!7i{!(MYibn`@O~onn(>3l>#KQAm*oi`u2w zrPza64k->$mSc(|lx2)!gA>?g&M8h{`&_`jaZPb)W=&N~QBKilW=d5{aZ7Or(;g|F zVA?CiJH@A&IaMviH^nc-7tHcc2}lV9vw~8BQ$oP3(3G&0a4;((B{C%n%!*ElNr?rs z;!@&M62Pp)l%$koFe@b`H6;zqN>9m1$po{qQnFIA!K|E=94IR{B^S!dOUX;g2g??u z6oOq>lu`_)OHxX~bXiJyN*P#1MM@=Dq$;I4r3Nfgn^Koj4`wx_G^R9xS<NXeDXm~u zTS|LM2bk5F(v{K;X7!}>ru2bX{V5YtCW2X$QYNQN0kfv2OiP:>M2{n0E%IuUm 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,608 @@ +#!/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 <http://github.com/ActiveState/appdirs> 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_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +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' +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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + 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 "<major>.<minor>". + 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/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # 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.sep.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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # 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/<AppName>". + """ + 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 + + +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 "<major>.<minor>". + 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/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> 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 + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + 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.sep.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 "<major>.<minor>". + 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/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\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\<ProfileName>\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")) + 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 "<major>.<minor>". + 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 + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + 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 "<major>.<minor>". + 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/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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 + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + 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: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + 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 + + +#---- 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/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a4b3ab0be94fa37e81e238a3fe76c7d49eb86c1 GIT binary patch literal 745 zcmZ?b<>g{vU|`Vf?~J*?#K7<v#DQTB1_lNP1_p-W00stz6owSW9EM!RD8^i-D5hNI zC}u{66s8pB6qXd$6t)!h6pj?mbdD&N6s{=N6z(Xt6rL#d6y7L~6uv0V6#gi#6oDx2 z6v0$ZF@`9f6ro@SP2raydo-DE@h2t~=jW7`q{e6F7UUO|+~P>dEXyp;%+I^US5TCh zR}!CAnwMMx;&aBwmt>aYq{heJ;*O6mF3rtNEUJu;zr`LOUs{w25iLtC0_ly9zr__F zpIBOwkzW)ae~U9dJ~cNnGY6t3Co?%UuNY(uZ+v`menDkXW_m^mNLfK*a&}^RW?p)g zl5>7hszPZ=W=>{FW@@oQT7Hp2KxIirex3qEQEG9OVn#_xL9vy-etKp}Mro2>a(=FU zL1jUrK12n`7#2e_J&P($m;AiMoD_xNlG3!a5{1OP6ot$@kT+9G6LS=j^YcoIGLuS6 z@{5YA1X93C9g4w9^)mCTl$?TH6!MD{919YYGg1|NAdc5j2!r@k!AQ@bO3WGN3k4$s zLla#i14A<f)nY$QUQjTkm6ntirN+k>F)=VO6fuJc76t|eP`D-L<iy7pv4VuyKm<F8 z0L6R}Cx`_~9Yx$A77qgh!%BuC0T3HR{A$%ND9S8LEJ@WbODxh)%g;$kEh^SGGS)XX zGczl<D6upz&Wlg6Fv_(|u{1R?HZ3<WFfd3j&=1is$Sly!%quQQ%*oNUFv!i$$TrH+ zFHS8fEhx#)&nea~$WD(hN-fSWElN%;){ies%}dEILWHS)e0*Y3erZX3yk0@&Ee@O9 i{FKt1R6CH5ibWV07(|%47`d2P7+Dxum{^#=BqIR+VBd`Z literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e505a5790b8ab545e0585e281d67497aae2d1ca9 GIT binary patch literal 583 zcmZ?b<>g{vU|`Vf?~Gw&Vqka-;=nKm0|SEt0|P^G2m=E{3PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6l*S96k9HP6nid56h|&+6lX416jv^H6n8F96b~aq3QG!W3R?<$ z3P%cO3RenuI!6?53QsVDChtp-U7F0d_!E<g^K(i|QsXmo3-XIfZgHe!mSq-a=I7nw zD=5m$D~V4l%}XxH%+Gtt2y!mREw1?Z#L|+C{G#~yTfFh{$@vA9MVaXtCGqjMIOF3} za}zUj;^S{|$H(VnCa2~Vr$RWzrMbC@MU@amC7C5TAaVBi_|l?Gh=Q`zB9N`|@kQJW z3=Bn}z$xMZv3NlQ8;Ae}OA#lC#m>OM;HSw4a!XoiNoi4Pe0&iTNP-zeurM$%fZURp zlwVpBA72F44AN4BFac~n*e19ox7g$36LWIn<5w~i34+W45x-jW3yLz!5=&C`%My$9 z)ADmtQj3c9jg0k;&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf| z5_58NEevwAGqR0x^ovtVN()Nz^K**z3$oMWi&Bg8ON)|Ii}mBnQu9*si}VW;ld}`k pGxO5*<Kr{)GE3s)^$IF)aoFVMr<CTT+JXF54Dyf&lLi|XBLHQKo@M|5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e034a352d5300748fd73faadf696fac15809ab67 GIT binary patch literal 1035 zcmZ?b<>g{vU|`Vf?~I9IW?*;>;=nKy0|SEt0|P^G7y|=C3PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDiY1jLi#3Hok|BjTn<<J7&SS}DiegV?FLFucNMnrR%wtRC0?{d~DQqna zQQRp^!3>)0FG03xGT-7)Oe)ULDJ@Bj&&(~zFDkjkk&;=KS)7@lcZ;u}C^N4lKCLt_ zxg;|`&+jG3VK12(7#NZnLAn_j7(g601_lOpkaN`-7#Q3c+8Npz)0k2iQ<z#fQkXgz zo0)5wN*ER})-a_or?6x)EMy60&}6OB=TcBmP;f3vO)N=ONK{BlEKXHO&PgmTRw&Ob z$xujC$W1Lt1PkbaRVG7i1XCbuL5yN41_p*yhA74qhA1Xvi=&uRn1dNKS*jF4ro|)7 zvdPI$PRuE`(}N2ovw%!uU|;~zAS?{>3l9SWLkD9GV+TVGb2G>&M!%H|nk=`NlXHr1 zvE(J@rrzQz$;d2@2RXd>7GsJg(=ApAn+0Ta5hz4{HR~4?WtJtDr0SO?7U`$u=cJ?- z73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W?6_+ID<mg%$ z<Ys4N8|CO1r<Rl!l;r2<6zdmcr^gqi7U!21C8rka$Cst%rQ{ds7bGTUC#GlSrR&Eh z=jRqAmgp5!-eQlB&r2<jkCy@Y3lxP6j8&QhgGCRj%TJT#7Ds$M$j9;Vx47ctbMsS5 zb5i5uZ}G&(7nUaGKxB&e85kJAp4Mb40tH?XFHE3_kAZ>V7AGiF!0{;!a|Z`w5h$#0 z@t356l3rp_Wjt5`)R<c=C6xuKV1qT8A;y6X2I+w+L9z*K2_LGrL_juyqLhJMjJZe* zl;3zjUPvn~DJ@Ekk1qm+MiD466@gUUVlJ*MzQt3PS_De|@tJvP`L~z@B8@<V@h#@! zlA>EY#U(|VdFk;WmlfaQ0!KJl1Z+CkRY(NbO&m6m5VHeWQ4A6iVd7xsW8`CDVdP+9 GV+H`R%m_6A literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecaef184bd1cbff7a709d2b2ca879ac102d78115 GIT binary patch literal 2887 zcmZ?b<>g{vU|`Vf?~LhSWng#=;=nKq0|SEt0|P^`3j+f~3PTEG4nr<u6k{$^6jLs9 z6f+}(J3|Un3UdoX3Uew;GjkMcDr+-C6stQ!3QG!W3quMkSd=Z5t(hT;Erl(ZL6iL@ z$ZSpKTl|Sh#rZj<C8_b5xdr(}CAT<IGRrcHGxPIq@f8$h=9R>!mF6XvWaj53gLJ?! z6U;>+3=9mZ3{i|J3{gxej44bl3{lJ}%qc7_3{fm8tSM|Q3{k8p>?s^AAe%W;xLO#Z z*i*Pucv={uI8u01_*xjEI8*pj1X>uPxKadDgjyJ)xKo6K88k(1ad_sXW#(m;R3<Y* ztp(8_><kJEP@tqR1~X_f`4zD;FfgoS&}6*DQk<HTR>a1@zyKzGwd)rYWtJtDr0SO? z7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W? z6_+ID<mg%$<Ys4N8|CO1r<Rl!l;r2<6zdmcr^gqi7U!21C8rka$Cst%rQ{ds7bGTU zC#GlSrR&ERmlTyImy{Nz7V8yM-r|UlFG?*aijU_6xg8XI42)HRFdyo{WKq1z%)r0^ z_9_np149Wz31baIGh;Kz%Zz@SOt)Av5{ol#v4D)#WGrHb`5El-A`S)y29Tv7HSzHv z1B$U&3Xx3)%P=r7fM{&t>jpMclL>6eE!O;!jMO5q5QG5R#TFl*QxYG~kK{dmB=3Rb zNVBJi7mJTTwxq_#3*oXQH9j827PKI&VXR@uVr*s#X3zu&Ay;NGIF9p@Q*Uv`$0z3` z78l3ILp_Si0jY)Y@uD~!0FuM*06uUW!W_WE0Chr<0LYhupqvj0UR<{3rN+lg;II`W zhhi(XNDKi-76HGdm&C_Q<FExJM<rWQ<KyLU*#e3}ko!S-9z=sMI2V92d<it%7;g#q zrKTsAWR|7E5*dy>z#bo;mzo|QuZU!y08Eb_RMJnA2b5Xz5_41I<8N`r$LHp!l;(ig zJn`{`rHMHZnIcf;EdphxB2aV|ff9QWC@mHVgJMwxM1WF8kvND2FNMGX56+R`f(n#V zi$S_Lm^heGAy}T?1#OWS0|Ns}!GjXy&@#4)Qx_I$VE<qbZg2=`A_cW1dNh$!)D?lM z#v*P|Cc#?Jfulr+fUQK9bp*2sIO_G0EEC7#MWTv3!d8J2m=PhXKp6&9a)UAqh{j*$ z5mn%T6SXM;i)mBVfwPhY0jr5B@K9<kY{hC3D8pJ4u!^WskFZssV!@7(RiKyz<vmbL zf@l!NEc(EO1di+nDtH``tdYQyHo?WApC(Tcs5&W<1Qk_MAcEq;4OEV(gDl5UxPj#T zG}%GrYg#F&WfUJ@1WK?)pcGpKD&B9g<tJsOCYOM{2rievWepMmZfkJZK+0!3ke*_Y NkO;GYEE}_cECAhh1^NI0 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8610ccf8bd8ed4cba5f36ab29c5f7457c12499c2 GIT binary patch literal 8895 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 OF>`QpNON#-hywt`rP%oZ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fc3773f7778c742411b661a3b0917bcd44b7772 GIT binary patch literal 3900 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..698ddbbb02b2575f3f5bb6430e42273b760e82fd GIT binary patch literal 19813 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91515455187342f93f1e115aad4e2687aab1638b GIT binary patch literal 514 zcmZ?b<>g{vU|`Vf?~GZ>$iVOz#DQUE1_lNP1_p*=BL)VB6owSW9EM!RD8^i-D5hNI zC}u{G7*h^Q6iX`00@f7fg^W>bDJ&_hEeuiYDNMl(nrtsYCTTL?;!jK}&d(_=NsZ6U zEyyn_xy6x^S(aIxnV)xyub?P1uOvRLG%vX%Ge6I-iY;0<UN2TVnGvLyfq?-;voJ6) zID;G_z`(#z!mxlbg|UWVA=3h;g$%(AnoNGb7<Dz7ZwbdIC+6knWhN))WLBld7p11B zR@`DPE={_{nv-9iTBON%izP2HH+3aL5y;QK8ubf`GRqQ6QuWIci}cg-b5c@^iuH|* z^^MKU%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ic1o6a&#>Wa<enC zjdJvhQ%gz<O7in_iuDV!)8mU$i}Op1l2eQI<I7U>Qu2%R3lfvF6Vo&E()CMAGINUc z3My|2qPQ63I3AEUnLvJLDgv=JIc{;q$ETH+loqAN#}|QQia_yF1PYT|Ohu`;*pu^f t3o>(3i`W<#7{GeK-a{g|85kIDaoFVMr<CTT+JQ6{gVc&JaWHc+0{{-Pi3k7y literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a6ac0dd11946cb477df55dc5dad96314533840b GIT binary patch literal 10580 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 PmMqKy*&Om*%pBYR<Q|EY literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 0000000..892e578 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pkg_resources.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 0000000..0c8c4a3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pkg_resources.extern.pyparsing import Literal as L # noqa +from pkg_resources.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py new file mode 100644 index 0000000..4aa30ee --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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 absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 0000000..c1eb9e9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if prefix and sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'packaging', 'pyparsing', 'six', 'appdirs' +VendorImporter(__name__, names).install() diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14cd98b6e50299b2a948bba72c993db621de424e GIT binary patch literal 2428 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py new file mode 100644 index 0000000..a381c42 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from .extern import six + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/INSTALLER b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/LICENSE b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/LICENSE new file mode 100644 index 0000000..6e0693b --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/METADATA b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/METADATA new file mode 100644 index 0000000..02699f5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/METADATA @@ -0,0 +1,73 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 40.8.0 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Project-URL: Documentation, https://setuptools.readthedocs.io/ +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +Description-Content-Type: text/x-rst; charset=UTF-8 +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26) ; extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2) ; (sys_platform=='win32') and extra == 'ssl' + +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master + +.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg + :target: https://codecov.io/gh/pypa/setuptools + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +.. image:: https://tidelift.com/badges/github/pypa/setuptools + :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/RECORD b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/RECORD new file mode 100644 index 0000000..4516c08 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/RECORD @@ -0,0 +1,186 @@ +../../../bin/easy_install,sha256=R0nGqF_8cS65gQK7gMxiCSR3bvlvMdnhbpNVi1yr0_I,301 +../../../bin/easy_install-3.7,sha256=R0nGqF_8cS65gQK7gMxiCSR3bvlvMdnhbpNVi1yr0_I,301 +__pycache__/easy_install.cpython-37.pyc,, +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=dBxLHQMU0U5ebfsfyq-bhf1TtXXNI1YIEA30mLVthjA,106677 +pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-37.pyc,, +pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 +pkg_resources/extern/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 +setuptools-40.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +setuptools-40.8.0.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 +setuptools-40.8.0.dist-info/METADATA,sha256=DDB8y9FmrtyibMzlTEiDa4A7hI5rsYW93ulLQzRi24Y,3094 +setuptools-40.8.0.dist-info/RECORD,, +setuptools-40.8.0.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 +setuptools-40.8.0.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-40.8.0.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-40.8.0.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-40.8.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +setuptools/__init__.py,sha256=WBpCcn2lvdckotabeae1TTYonPOcgCIF3raD2zRWzBc,7283 +setuptools/__pycache__/__init__.cpython-37.pyc,, +setuptools/__pycache__/_deprecation_warning.cpython-37.pyc,, +setuptools/__pycache__/archive_util.cpython-37.pyc,, +setuptools/__pycache__/build_meta.cpython-37.pyc,, +setuptools/__pycache__/config.cpython-37.pyc,, +setuptools/__pycache__/dep_util.cpython-37.pyc,, +setuptools/__pycache__/depends.cpython-37.pyc,, +setuptools/__pycache__/dist.cpython-37.pyc,, +setuptools/__pycache__/extension.cpython-37.pyc,, +setuptools/__pycache__/glibc.cpython-37.pyc,, +setuptools/__pycache__/glob.cpython-37.pyc,, +setuptools/__pycache__/launch.cpython-37.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-37.pyc,, +setuptools/__pycache__/monkey.cpython-37.pyc,, +setuptools/__pycache__/msvc.cpython-37.pyc,, +setuptools/__pycache__/namespaces.cpython-37.pyc,, +setuptools/__pycache__/package_index.cpython-37.pyc,, +setuptools/__pycache__/pep425tags.cpython-37.pyc,, +setuptools/__pycache__/py27compat.cpython-37.pyc,, +setuptools/__pycache__/py31compat.cpython-37.pyc,, +setuptools/__pycache__/py33compat.cpython-37.pyc,, +setuptools/__pycache__/sandbox.cpython-37.pyc,, +setuptools/__pycache__/site-patch.cpython-37.pyc,, +setuptools/__pycache__/ssl_support.cpython-37.pyc,, +setuptools/__pycache__/unicode_utils.cpython-37.pyc,, +setuptools/__pycache__/version.cpython-37.pyc,, +setuptools/__pycache__/wheel.cpython-37.pyc,, +setuptools/__pycache__/windows_support.cpython-37.pyc,, +setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 +setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +setuptools/_vendor/__pycache__/__init__.cpython-37.pyc,, +setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +setuptools/_vendor/__pycache__/six.cpython-37.pyc,, +setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 +setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 +setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 +setuptools/build_meta.py,sha256=kZwHurq0_tHoFMZgL7E9_6ym6EWfnlkLhqA3MCszMpA,8553 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 +setuptools/command/__pycache__/__init__.cpython-37.pyc,, +setuptools/command/__pycache__/alias.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc,, +setuptools/command/__pycache__/build_clib.cpython-37.pyc,, +setuptools/command/__pycache__/build_ext.cpython-37.pyc,, +setuptools/command/__pycache__/build_py.cpython-37.pyc,, +setuptools/command/__pycache__/develop.cpython-37.pyc,, +setuptools/command/__pycache__/dist_info.cpython-37.pyc,, +setuptools/command/__pycache__/easy_install.cpython-37.pyc,, +setuptools/command/__pycache__/egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install.cpython-37.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install_lib.cpython-37.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-37.pyc,, +setuptools/command/__pycache__/py36compat.cpython-37.pyc,, +setuptools/command/__pycache__/register.cpython-37.pyc,, +setuptools/command/__pycache__/rotate.cpython-37.pyc,, +setuptools/command/__pycache__/saveopts.cpython-37.pyc,, +setuptools/command/__pycache__/sdist.cpython-37.pyc,, +setuptools/command/__pycache__/setopt.cpython-37.pyc,, +setuptools/command/__pycache__/test.cpython-37.pyc,, +setuptools/command/__pycache__/upload.cpython-37.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-37.pyc,, +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=MQlnGS6uP19erK2JCNOyQYoYyquk3PADrqrrinqqLtA,8184 +setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 +setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 +setuptools/command/egg_info.py,sha256=w73EdxYSOk2gsaAiHGL2dZrCldoPiuRr2eTfqcFvCds,25570 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=gr5hFrDzUtGfp_0tu0sllzIyr3jMQegIkFmlDauQJxw,7388 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=fSl5OsZWSmFR3QJRvyy2OxbcYkuIkPvykWNOhFvAcUA,9228 +setuptools/command/upload.py,sha256=GxtNkIl7SA0r8mACkbDcSCN1m2_WPppK9gZXJmQSiow,6811 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/config.py,sha256=lz19l1AtoHctpp1_tbYZv176nrEj4Gpf7ykNIYTIkAQ,20425 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=35jtxaSIVmyhEHbZ4Fw-zrLic3B8w6t7GaJN4d5-OzA,50176 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 +setuptools/extern/__pycache__/__init__.cpython-37.pyc,, +setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 +setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 +setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=zuL2nOfEYssSp9zvn2zjla0MAW5Om_0abbB5zKH72h4,40594 +setuptools/pep425tags.py,sha256=o_D_WVeWcXZiI2xjPSg7pouGOvaWRgGRxEDK9DzAXIA,10861 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=REvrUBibUHgqI9S-ww0C9bhU-n8PyaQ8Slr1_NRxaaE,820 +setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 +setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 +setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 +setuptools/ssl_support.py,sha256=nLjPUBBw7RTTx6O4RJZ5eAMGgjJG8beiDbkFXDZpLuM,8493 +setuptools/unicode_utils.py,sha256=DGAJ914PBcuIKjy4bnoaztdq8iY-7EaVC3sU-xy2f_c,1260 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/wheel.py,sha256=94uqXsOaKt91d9hW5z6ZppZmNSs_nO66R4uiwhcr4V0,8094 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/WHEEL b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/WHEEL new file mode 100644 index 0000000..c4bde30 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.3) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/dependency_links.txt b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/entry_points.txt b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/entry_points.txt new file mode 100644 index 0000000..4159fd0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/entry_points.txt @@ -0,0 +1,65 @@ +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-3.6 = setuptools.command.easy_install:main + +[distutils.commands] +alias = setuptools.command.alias:alias +bdist_egg = setuptools.command.bdist_egg:bdist_egg +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_clib = setuptools.command.build_clib:build_clib +build_ext = setuptools.command.build_ext:build_ext +build_py = setuptools.command.build_py:build_py +develop = setuptools.command.develop:develop +dist_info = setuptools.command.dist_info:dist_info +easy_install = setuptools.command.easy_install:easy_install +egg_info = setuptools.command.egg_info:egg_info +install = setuptools.command.install:install +install_egg_info = setuptools.command.install_egg_info:install_egg_info +install_lib = setuptools.command.install_lib:install_lib +install_scripts = setuptools.command.install_scripts:install_scripts +register = setuptools.command.register:register +rotate = setuptools.command.rotate:rotate +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +setopt = setuptools.command.setopt:setopt +test = setuptools.command.test:test +upload = setuptools.command.upload:upload +upload_docs = setuptools.command.upload_docs:upload_docs + +[distutils.setup_keywords] +convert_2to3_doctests = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +eager_resources = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +extras_require = setuptools.dist:check_extras +include_package_data = setuptools.dist:assert_bool +install_requires = setuptools.dist:check_requirements +namespace_packages = setuptools.dist:check_nsp +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier +setup_requires = setuptools.dist:check_requirements +test_loader = setuptools.dist:check_importable +test_runner = setuptools.dist:check_importable +test_suite = setuptools.dist:check_test_suite +tests_require = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +use_2to3_fixers = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool + +[egg_info.writers] +PKG-INFO = setuptools.command.egg_info:write_pkg_info +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +top_level.txt = setuptools.command.egg_info:write_toplevel_names + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/top_level.txt b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/top_level.txt new file mode 100644 index 0000000..4577c6a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/zip-safe b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__init__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/__init__.py new file mode 100644 index 0000000..a71b2bb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/__init__.py @@ -0,0 +1,228 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import sys +import functools +import distutils.core +import distutils.filelist +import re +from distutils.errors import DistutilsOptionError +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from ._deprecation_warning import SetuptoolsDeprecationWarning + +from setuptools.extern.six import PY3, string_types +from setuptools.extern.six.moves import filter, map + +import setuptools.version +from setuptools.extension import Extension +from setuptools.dist import Distribution, Feature +from setuptools.depends import Require +from . import monkey + +__metaclass__ = type + + +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'SetuptoolsDeprecationWarning', + 'find_packages' +] + +if PY3: + __all__.append('find_namespace_packages') + +__version__ = setuptools.version.__version__ + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + + +class PackageFinder: + """ + Generate a list of all Python packages found within a directory + """ + + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + """ + + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) + + @classmethod + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) + + @staticmethod + def _looks_like_package(path): + """Does a directory look like a package?""" + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches at least one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + + +find_packages = PackageFinder.find + +if PY3: + find_namespace_packages = PEP420PackageFinder.find + + +def _install_setup_requires(attrs): + # Note: do not use `setuptools.Distribution` directly, as + # our PEP 517 backend patch `distutils.core.Distribution`. + dist = distutils.core.Distribution(dict( + (k, v) for k, v in attrs.items() + if k in ('dependency_links', 'setup_requires') + )) + # Honor setup.cfg's options. + dist.parse_config_files(ignore_option_errors=True) + if dist.setup_requires: + dist.fetch_build_eggs(dist.setup_requires) + + +def setup(**attrs): + # Make sure we have any requirements needed to interpret 'attrs'. + _install_setup_requires(attrs) + return distutils.core.setup(**attrs) + +setup.__doc__ = distutils.core.setup.__doc__ + + +_Command = monkey.get_unpatched(distutils.core.Command) + + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + """ + Construct the command for dist, updating + vars(self) with any keyword parameters. + """ + _Command.__init__(self, dist) + vars(self).update(kw) + + def _ensure_stringlike(self, option, what, default=None): + val = getattr(self, option) + if val is None: + setattr(self, option, default) + return default + elif not isinstance(val, string_types): + raise DistutilsOptionError("'%s' must be a %s (got `%s`)" + % (option, what, val)) + return val + + def ensure_string_list(self, option): + r"""Ensure that 'option' is a list of strings. If 'option' is + currently a string, we split it either on /,\s*/ or /\s+/, so + "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become + ["foo", "bar", "baz"]. + """ + val = getattr(self, option) + if val is None: + return + elif isinstance(val, string_types): + setattr(self, option, re.split(r',\s*|\s+', val)) + else: + if isinstance(val, list): + ok = all(isinstance(v, string_types) for v in val) + else: + ok = False + if not ok: + raise DistutilsOptionError( + "'%s' must be a list of strings (got %r)" + % (option, val)) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + vars(cmd).update(kw) + return cmd + + +def _find_all_simple(path): + """ + Find all files under 'path' + """ + results = ( + os.path.join(base, file) + for base, dirs, files in os.walk(path, followlinks=True) + for file in files + ) + return filter(os.path.isfile, results) + + +def findall(dir=os.curdir): + """ + Find all files under 'dir' and return the list of full filenames. + Unless dir is '.', return full filenames with dir prepended. + """ + files = _find_all_simple(dir) + if dir == os.curdir: + make_rel = functools.partial(os.path.relpath, start=dir) + files = map(make_rel, files) + return list(files) + + +# Apply monkey patches +monkey.patch_all() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..686137a895aa2296b5ca96fffd36abb6974c8260 GIT binary patch literal 7710 zcmZ?b<>g{vU|`Vf?~EyyVPJR+;=nKm0|SEt0|P^G2O|SR3PTh_3S$aW4r3G}m}ZJ% z0@KV<%wU=&iWN+=L233V_7uhx<{XY(&L~bskY1J?u3YXYZZMlQhbNaeikFcgg)N0W zhcA~uiXSY_kt2{R7$ul16eR@abLI%=ibRRzibjco`Aj)tQQ|3#DO@=cxsp+mU@`6- zsa)wO>0Fs888DwGM>bb3N)Bu`Z;pJfLX-j{L#kqwQVL%Re~LhgV2V(RaEeHZXgWuf za;jj_vsC2;Dk)+M85tQ;#j{ki)S}c<n4;8E#G^D)B+?n9G~F3eBvYhX7*eE~nWD7Z z8B(NEWLg+fWKy-7nWMB*wX$@gbW;T<Fc#^gYG>(0>7~e~$h9y;>8Hr2@U<{R8Kkmi z8D<$|F{B#AGo&gkFaq<97cxefxHF_EqzJY!qzI;(G&4sTrzoZ<wJ=1PrZQ%kr7@-` zr>L|rMwzE7EU;L}z{rro6wIKhTIJwcQIeWhoSC0jtWc7#P?C|Vpq`RhTvA$+nNzH; zkd|Mhkds)Ho~n>vq>!ASTac4lp#YLE%1kOP0qJ@PieW!Z##<sTFm3(?AQ{)9qWmIF z##=ne`FUljMJ4eCi6t4DjJLSc@^TYPk~5MMi&I}Rg3=4)Et%ldlG1{b{QR6^m(+ry z)Z|2v3E_!Fd6{|XnoPHt10s!Y@f4R7W#*;FmsA#{7HcxyVoS@+DM>B5#hja1pvicP z6YdjDrdvE9$H3fpi`^|Xv81#pRg>`+dr)d&X(pJ-mYbiKomzQ|wHRc15f1|cLlG|n z1H&zL=ltB<#JrRuZjcZkh+qSW^QL9yrNkE`CTAz6rxxE52Xpfhb5n~85|dNm5+PN* zIhjdDCHcmBX_*zN#mS%$f?*a|K5$}SU`S<%VoYHGrTr-8RF)LJ6xI~B7RF}ADArV# z6!sL37KUcVD7IAg6wVYbFq<QlJ%u}k2h8S7;SFZc<iEum0CA98W?o8aQI#i`f`WpA zdum>4QDRA|LZU)WW^su^ewspJPL4uAWl2VUo&wAZ3TgSJc_|9znI##Sc?yXNDVas7 z$tC$km0&Y&G3u>kSjl*cQ7akbYLE{=G&=(WgEJ^6t1&PzlrYpVEMP2Qs$pzqtYOGv zPGPQLn#a_~0AklL_c1JFZe|Q-&}2#EWM*IpN-ZfZ0@(w05<&OCU8A60o{?IVs?G&= z7RY;00fo$BaEdL;&o4nZUZFfAGdV+{JToUpAt_a%I5n{-IU_X%oR(oe*HcjNEP)$W zoRMFelLA&;T2PRanVO=ISgeq!pp;ycUtFwPkds)FmS2>sq@a<hm#U`_8swu}TvC~n zs;K}<)7A=^C1Bg&<|U;nKofmx3M^M878Dfa7ZhcJA|)q3IWY&USE0BvuOzWT56Nq( z70EfJDXHop&m}4prxuo`<|U_sVi4+h1#prBnG02Ft)Q-@u8^FV2l7E_acT<OAz)vW zXXd0NCl;kBWafcG3#?s7p|~_TL!l%iu|z>VEk9pROC9V71*n;z<N`OQxHJiBcQMEv zAoc1B8cC%k3VHbu?dl4dCB>;ZX`0AB$;>0#Cs3uJXh~DZEKx5;*j<pCoSBxHnxdnS zpO;e!_dyCG6~kg0YDfyg6p;I{nFLCEkhBl?7ZyX*p$0<2HaS19Br!7&VO&OPPL2XN z9e_d(62t|GB_*jvdBqA@rNt!*Ihon13hK}hRo8=Sy~UAQ6%Q_Te(`9<#}`y4Cnjg4 z#>Z<i6-k0h8!1q!$a0GXluvF6$Ailmm_y?;OHzx9n8D>yd{Sv<PD(ta9MojF#hjc| ze2W#FS#GgIt-Zw#^+k~w$Y>DpD__5$D6=fFBvrpGu}D8HKPM%%s94{~Sl`&p%&gp^ z#L~PtFFwV>DAzK@($vJ*wA{eJz#zRqKSaMEvp_d9uec;JCr8)9AU8WB+bBmL>=SU| zjm(UX&&<m#iI3MSsJz7j@`4Gd&;Ydq7=+ju*%)~ktAtRBE<KPUcu@l?jzOg^sPrse z!N9;!v8aS0i?IgWVCZFXVThd&!(7W!%Ua7;!<xdJ!raOv$xzFl&H&@tFjVB!u)8qC zrqptjFk~?;V6I`Q;aJF2%L(SO)Ns}?E@Z0Zs^MC|3KGd;OJP~aRLh;hQp1tWR%}tj zuz<aWb0K4KO`$~%a}9ShW6`7<CJ<dbsfIg@fsvtxbpb~W2dJtqv<PP?6bNTXVGd@{ zWUYdfpP+)uF((I{VqvidEpapRU}YL42Non2LrOA4l7mF5jzUr?qMQQdHgF9MjazjE zh$=+N3ISKJ`8hfH<vE#o*~NZEqM)?Id5bB(_!difVovrg7EqaWizO>RGw&9AQECpD z%U+aPkdv64dW*R@wcwU;d`^CTc5yr?{lcoXTWpC11*v%{nmk2vpoAn3A{0P`A}B4g z6y@ia++s<|EGoXmnwFW9S{%iZn3EF^7GO@vEV{*+R+^IoZUo%oC`yI0*r5S~NSsAV zATwnc7#O@k=|uum?XXEP@i6i*aWV2S@-Yf93o$Y=3ox>=R4JmSA1oOq8Pvc483Cd} z$q8I@fieLoF)d&Mlgu>?DU1u57J_OjrYcpJ{8UikkEnh?fdR?OiLgS)zKR<ueQUB5 zse)Xs4hjjj%wmxLi!?w1&sYQ!L-(By0|P@k$ahR2r!iyr17sm;=!0?rNG$`%AE3++ zs)dU|d8C~o4V)!fID#28nXCHYg^YV<St`7;%})bWH{ha4N1+H-4<{$)<Rm8Lq(TxQ ztOP76DourywV7#f(?H2CGq0euL;>7*1BFnDLQZNTsBMu4uAM+CV8tIIL83$esQDla z@;4*`5Kix4bYW;_1UD6!{oq<ap~K3+z+ep00xA=07-EHL8A}*C7-|?(7<!pNnXr&4 z1srdhjJKEz5=;Cv8H+&HXfoYm(laPB14qIw7EqlBi3L#d`o(FJo|>0hQBY)81Tq_B z5eq|=16p!IE?xC(z?F8fot{ljVs27OB8UO1#z7)5!$59G%&XL7EV6*u%K-}zs1P`D z-{OE70k#|ztyQ`tSq=7yCS#E`DA9q!62=C3u1J=FfguOxEe5tKX*_28X)=RL2(XDo z;viRZ-QtLk2ZdLB{4K8d_}u)I(wx-z_**>j@r9*{IZzq)`1q9k<oNho+{rnK#l^X) zB^miCMam!tf$}b>v7T6xnG6*NC3vvAAohTq3}JyCEW*IRpbv5|C_Qs9voJ9+@`&-s z@URwvWZ+336i}d~5AH^S$^}^SIThS#1UHIVz$GxtE#Uyy023nv6raP>6(|pZFt{uL zB^F2u@(TgGNfURTEdx0clvo&;s?@RApogX0^wVT5vIPZ;9f+_85um1j5jaQ?0Rd)# zLj&ZhQkX>?j71<m-02|8;l&szAixC}QwcN#Y8V!<EM$P>rG<>Oj5Ul|pt_Nzmywa7 zhB1q+$fkyI0Xv8Vs<l!WK(&=0+;C9ff^ad&c92_Y7-FSjm}(honLzn1o2`hchOvez z4K?2}-4aMi1=S3xdC8UW;9BPvAGk>nUj*rE75hN~mbu6rR6sIj-(oBSi$DmFO+}Ur z3=FLxdqMHR!obE@r4<itXh2#@aKn&tA}rs9Xfj5LWTxlk7p2DMgFBz`si59xu_nhY zPEc<Z+?&0{lAK?Z3hw8DDyrm?TdbKSskz0sgbEUiic{m0^YhX&(?PAN)Z!vn1_p*G zfwa_;<P2ylD>XeG)aztTEGa1}1{qLX0&zb)>TZeSaB?HaW8kq7W)4O%79K`6#v*?P z1_pT22Bk(&$b+jqka?hfRWl<aLkVLRQx<a?Lk&Y8sFY*$(_{hbEb;&)Bu@|_0LrwC zMZO?5NGrrq;6MdQ^?~dL1u6p*2P51<l)Pkx)D=x-&SHsTNnwm)O<_u5ZefUGOW}cZ zOQYB!UD7Cy6y6lB6z&$rD9#j?U<OUTB0&ZQ2DfBT+Ju=4vJmVUP+OsdVF6<eLk;6X zCPs!5rW%H3#s$nZOyCp<@)T257QC8q&d)0@DJo4a0k@ixA^mW0&kYofItrx)DTyVS zdFgNsWr;<_8sMG>xErgGm{+NgomyF*Uj*tP6eZ@SmZTOHBkChRO_p06@z4%FsHB55 zQg5+<47$YzHa}I9`4$Vv%pyNfdS%KkFG360Kn4bedGLT`<zcK6fEuX>YZmyyTe6@k z41_@$xfqo9L6KX-*vwSRQp1wMkj+t~RKf@fpBm<7W=4h@=3r1Lv6L`3GZovFu%s}8 zGF=Tz8nYNfGh-8D4Jgc+{HkQsRg2XXazXu!Bv3zJwOBzTJ-<XDLA5wRQ<L=;dwOaK zD6QUNFNQL>GK;}kDla*;2-FTQ0>zjnYf%Wumu!%XbBm=sBeCQbdrE3rVrfpvE#|Vs zoFY`;-x7*X%_}Y~N{xpM$bedj%RqqvN^T5{T#OuyJd7-iT#PJ?e2i66@PNV41Wz%b z)B<YIfJ3MNI;;Q=A*LFp6vk|hA~8@AUBXzyRKnEERAg4d3<|FjmIbUSOf^gknLy!| zX9kvMYi246DPd1xPGM<bs9}PXg|*CiEGewD%r(r#IVBt^Y@iTLV}gVy$Yf3Ss&}qn zKS7#8>X5*I_Q65jFi^i2;@x6M_Yz47JTWGh78RxDmE=?^Bq~4@>nN0`DijywWR`#i z2~smlGE$2a^79n*bz+LO^g)Aa`Z2}Y`Z@~5`EXN|((>~ak`jv)k`k+wbQC~boutGf z9SAouF9jl`pa53{>Z~gyr6%X+rov5$2I&K7Pf9F;P*qB?Nco_O1LTC7m||^s`437C zpr`<s|DX!Ch9On})ZVILEMaVhmHMDcgV9fusVD+e;(*eTCKI?|FLDP7pr#dYxxN>a zI3R{s>B5o&N@|D)1u>R_-K|O;EtP{5BE<zH$*UG=YH}8Zfvkr+swf<ks+o#XZ?S^I zzepOyXHLw?fh2ntaI!Co1Zj!^NipSTV<dD;M{WT51r#<6Y@mb=O6ForT#O=2EQ~CS zOpHuO2_92(5vZI`1{L(6auQS~fH1h61ofm~<zx-hLgreQ5~dm!a7oDwDk;Ia9$fqf zfE+7QlnN@iG81z$t3WjuWV|v6<e6YleE`kW?9dYQmJmdJd~s<KRH(Qp6l4%{a&8Km zw~Iiv#8HqxK`jjiaHp$E1{QA+gHSEjWCS(4L7vm(LT~JVoLdBHsYFRZZ3b1e#ihBa z#qo(n>7}`;c_qa~paQih7UcXS5CL)llB>XJ3S6UsYMPlKr-7S_jBHFSOdK3sTpXe( zi5L{B;IafXL<yQmXkh@glWG`1r2=T|pqa6ju>{olW6oj$l{27rP?ah;?|_C;!TAZ) zi7Qqp1r4eysDnDm>R@@eMIcK+0R+x1pw?UsL##>+GpMx$Drj67Vnu3MK-Mk*wVGHK zLh_G5ArrXS#RzJ7!#j<T&LS%~8{J|_N-Rz-0yT(>3_wxD0&)pbXn+F()Lyy(3J6e! zWntuCtWt(_e?gt@;!My$J(m0wqRCjK0!bfWyFuYo#0d&<a5vQyB*g^ovVw*Nic51! ziqR~-C4g?tX^<;G0l~n^#wf&Glm%+ofYJgejf2uU$c5n80CmPdbss47YrsvLY^EZ; z66P$H62>gnEH+R#yqBq#sf4`-G@#5>%UHqz8dwfy&}6FW0f#>J*h$GOQda;KjL@Df zs4EI9C_tkQpkb0!P{#$@5D3l7Ni8l0jTnOlS=IH_;eBFM)sQAdN@kHlK@p^hn*u38 zH5qTQ7MCOzm1uH;{R{5?-(pKHErO18<Ryd0!)~z`Bo>uqCgy;{v`7;a(x7%AxG>UW zE;0lOfFe1HBR4TSHNGenqq1cOjfy4a<Xi^@Ge|E3D+ePNqYxt(V^KaRzAVAH3*rLi z;>zNpTu`Fn1GSgH&0alls~6N>yd{JX1f?lZ5EaFNR0|*^APr}58F>rI5Rg%jQAc*@ z{0+F99VHT<f|#(0FNe(76oHaMlqk3p01gMe)C$npgI;lFMG>f?2RA>Wq_HZ{%grxK zErz5@kbk3ukd&3B7J=rfZgC;RqC^mEusz_}Eb!b-6hD#_$cx~{KX{S{#Z*ZDrML(* z)pLuXh#wRrETCzoTfFh{xv3?I;684A{4MtQcu@X|FVY1mVTZYfJ3b!DjE|2JOUlnL zDK05WEP(e0(u(qPqeO~I^Ws6XLh<=|puTfSYH>+%lo)iXC>}IbR0JDrD+c#`!CgN{ zpIQi%P(VW`kk&t_rBwuK{YUYpr<TN*<`sZu)KXKxE%737kqgR(MWA5-a4L!71gikK z9w|e^%hg*PHjsY49Vp`#gA8C{;$TET9!Agr91oKKqW}}Ac_#qov#{_mGBL6-voLZo laWJv4urRSP^SKGIu`#hRvN3b;a<K9+^Dzq;aq#f*0syO!%W(hz literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f574a68880183ed6f20be073c6f88781de87630 GIT binary patch literal 564 zcmZ?b<>g{vU|`Vf?~J*{z`*br#DQTJ1_lNP1_p*=5e5bZcZL*(6vh^Y6vkABX67iy z6sBMXP3B~nS`f_$Q!l{4z>vxi#hAhn#gxJr#SBq<OC~tAq_m(UKR>6~CAFX^H94^) zGe0jpu_!MyFTH9Jmx6+Vf>UB~szP#3VsWuTT7Hp2IYd$+1);uJAu~@QA)y#<Rzd<7 zSZhc|W-(N2X0bwEeu+X#YEfocYKlTyQGTvMLIS3x2?;t1iFqjsiNy-VrO6oznZ;m} z$})>HlX6lOk}4HaQqvMkb4v8U;(nSew>aYC^AdAY<Ku5}#mDF7r<CS^*gWy^g{6r( zP#O04_>}zQ`1q9!MQjWV5aL(0enC-YSz<}5epzCXep-G`N@`KDzLBxMv6-1!xkZVk zd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_Nn%cpu7yEvc1E^Qjy}Tw$jo@8 zfQp9(o?by^5h!XvxR{B7fq{b!%=gn|y2TC+eXsz+u@DwJ0|Ub?4jYIk?ZDbW(F_3g Cke?v{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbde18008dd768314095222e0ca8288f0f517da3 GIT binary patch literal 5145 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 HRUSP6eS^qp literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4301c074e5684faa11e9941b8e0fc2bbb06aa15a GIT binary patch literal 7772 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 V4qgsc4o-ns0Xa4%Hby990RV_f;6wlb literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a9872065dcd83defe7f9b7d2d31ad7b113182e0 GIT binary patch literal 17707 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..524fc99f91d8912c88a8cccb4e852c0fef506d10 GIT binary patch literal 871 zcmZ?b<>g{vU|`Vf?~GZ_%)sy%#DQTZ1_lNP1_p*=2?hp+6owSW9EM!RC`Lwx6s8pB z7KSLM6qaBHP1ctn^_q;gxbsrWQ;Xu$i}Fhgl0kYw;;ak|3?S?bGAD<DfuV$<hM}3U zgrSD9nK7HWNTP%>g|V5ji7}m_mMNW~mbt>IgbAXinbCzI)~J@Hgt>;HhDDO0h7m+I zGZpF8FfCw#h%IDfWT;_Yzygs2@e1|A8ETknnA4bo88n%yeupRKWGf`)mt-g;7NwWw zrskCtD`e&=6eJcU=H#U2=qQw=7MEn^r7L8nDWoPQXDAfsmlh?bDuBJAkXft%_7#_c zf`URxMq-{qW=XL^a(+=!YH>k+UJ6KKNn%lYYKfjgP-;nOQC_h^qC!DpW|2aEnnF%y zaY?a)2E@c-NXQiHK+FPbD%Mme&qyswg<4t+w+~_$#AF?X#N_1sB8Xl23MCn-3dO0p ziFqZN$;Du^^3xR5!LEeZprNU*2Ntg~RY$Q}T_G_qML`{6YO%UPZfS9eLQ*Qk#KhcG zg`Cv9^pXrs)?3Uusd=}!!V+^zQ(cRS@{4Y<7A5ATrxt-?^%h%VK|yL>iY99mAByqC zx7eXZ-{Q=Rhf0B%Fj2<Ll?+AP3=9mv^7RXfGRqQ6QuWIci}cg-b5c@^iuH|*^^MKU z%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ic1o6a&#>Wa<enCjdJvh zQ%gz<O7in_ijkQqsRi++C7C&T1(ml%AmIawnDWfxR7gOvfzqT9D3!7aFmf=nFtRWT zF$yvAF$ysi@iH(l_-QiV5=zM|E&-WRtOqj>9136sV9y{CJPZsBw>WHa^HWN5QtcQ) K#)CqPhZO*u-~G`5 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9147c93fdf643042fcdc851880a263055e250030 GIT binary patch literal 5280 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 HaPR{FM_g~Q literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86112414026a3d8f71cb2a62160d2b8d568a06c0 GIT binary patch literal 42224 zcmZ?b<>g{vU|`Vf?~GwM!octt#DQTJ1_lNP1_p*=6($CT6oz!hD25cq6s8=;C`K^N z6vYIlnWLD&G)oi<m}ZS)1=DO%Y+#x_iUUk@LTN52%?+lRb9i!jqj(uXX0zn*<?=`I zgW0S(0=a@wf?zgVj!>>}lrWghlp_))lERq6o+Fwo79|E2<H!-um57o6vpFH=<w{0L z=1N6LfyKCT_;RJAq`_?N9GP6%C|NL@Cr2(<K1v?U=FO4IRftjmv-xrqbCsf$a+RZ$ zb5){L7#ULdQv`BUbJe2M!197Q>bV+G8eq0ij%Kb_lopsRoTHtq6Qu)Yi{$9$>P6{+ z^@`@`=Nd#AfW?_|45JKFjZ(y#85tQ;jZ(xxbc#fZWD7%-af(!mbPGe2Ns3I0Yzsq_ zX^LEmd<#RAS*m%eMH*9-Wr{+IVhcl*Rf<xIatlM0b&5)gY70Y@O^RBIdJ998ZHh*U zW(z}<U5ZwUb_+w4eTq(sZVN+{LyBICehWjCV~RnFVGBc)Q;JcFaSKC~bBaldX$wP? zONv>Fc?(07YpPBvN0wWbdoyE{hdV=xMG8X;LkdHxM>BJjyE{XQWr|e`LyA>1Q<SGW zLyC2ZO$$ScO{!WmbCg#KQ!s<3?JXXc%;J)w%%swi%>2BUpp@jN$#_cyBwAXMnN#dv z0FrPmD#|a?WW2>$TvAk$pOl}Uqse%S)y35*)LoPDmS9OyVqS4hVo7RzPJUi`enE*Q z<1Ox#)U?FXoRXBxWDr*{H?_DpF+DXtttdY?J}omRRg<}hnSp`fmKfZwfSkmVwEUu6 zux+=5;o`xmC8Y&mK~2V6yhUlr7Dh(#sl~~O1*sr`;F6-u<dU$|qT<Z_JWa-1%*B}% zAh#AICTAz6XXd4AGT&m(O)R*@mX?`Ql3H|&8$zcg<`k#CWCZ0V##=IAOG@(dbBbM3 z3yM;c6G8qCPb|s<8NhgpJt(!XG_wd~A%A&hUP^v>aeQ%UK|y{I$alQysU`8Hc?F3j z$r-6BnvA!E3lfWpQ{$8K^U^ZYON+pUX)@m8Pf0CFO)iN~%}dTt$;?ZyQY!}e4Q#Dm zYDGzEQJx;$*?PqVsmYmXnW;s^Rm%9(l|j6o4Dt#n20=8aEN}*u1tJU#3?&Q;7*iNa zm=-cIGL$gaFf=m;GiWmTRY|(!E9B*uC?qH5<S3M6WELx=mF6XbJg&)di=!Ok`QlqF zAQmK^FvF%u3=)9M$vMR<8H!{X7#MzK>lYMdmL-;?>X#)J>8IuAq@)%V>l+#C8=IM# zm0OfpniuEAr&t)}TBcZ<ni!jw8yFZEq!;Li=oe%b=w{{>mn7!o=vo-$W@ls@<>({) zj?7HSEH2S2sJz7&j}rKLAWwsQ&%nsTSR~KDzyJ>yCI$uukPJ9nCV|7H22_eMG&9#S z)-a|pWOEet)i7i+7Aw>+WHA+Kl`y9;H8a*S=Ec=8WU-_$WOEk#)i7kSLRcjXH4G`t zDGbfbAbwFq33CbyShYb7Ll#?cSq(!LJDB7Elbm3ZtEi!bIfWIhj-!M*g$=~2VXR?@ z=dJ<83cKGef!x%R#FWI6#CT}LRxumt8Q$VAs4U6I&x<dDB*fw>W<xzA5Mc-+3^aLe zv8Sh&B$kvE-I4`m!}yfc;^d-CaQ+1)#FEs!lK7I!g4A351x5K~nJKBo@u?LhMTx~l zJfM8Ym7AEESCW{Sms)g70Ktw=%}vbAxy1p~bBhD!fLomTNyYg&sU@k!x44sY5{ru= ziS-swN`84>PJUuad}&cmkpd`vFx_G)PR&WX#gtnHP9hLO4rH$gDEiR7Yz&G;8E|6e zVd7xqVdMfs0Y)xHArOy=gNco)2o%@JpjZVd1jQ_<Kmp-m1x8S+uVHLv>||(XNCVe@ zEgZE>U^a6KOAALWa|vSyLkg=TLo+D!nQE9oaZ$q%&s@Wl!VVT=sbNat0JB(Ym{K^w zEVdM`8isiG8m1I(FrNd==d58$;Q{lxYM4@Z!7T0+z7B?LwxTIDOeuU|5uQAVZk`&Z z6n?M>FT#ct0kG<0HB2c2&5R59QUn)*+{ItRoFW8PD^SCnA`E5;f>LJ*V~R*KV>Z(S z#v-m7<`hw|j8F|TsGh1}h!?J52GvwG4Dlj)LSQ#SNMSHrB!w%OK~thiHz+kRrC6aP zBUJ$w0}5q{Ii;z^3ZQaYAyENTQY+*qWu+#U=%HjJP_PSwVo8F5fuVz;hCz}6oQW8- znTkYG7=jtV$(hOT7JI0lx1WEwA2`Z2nQpP<CFZ8yVg*|RDy?&i)4@_j;MBk!UzD1d z5}%ftnv>!KGM)nzw~QQ&9E>cCRZ3vVg6wo~4Weh0lb@WJQ*5V)qzT25pfmw?Bq%9$ zFf0J&ScZj6Acv+iWHS{>z#Ym6s`fw`C_XVKN0X_@0F*S@z>X}|WGpgbV1Sfu5La?R zEX>I)E(t<7k_X~QMZAs#>8XNeab0K@huFss<=tX0F3rtNEULW4mRMSnkzeFj#RFmJ zf^%aPXGVT*s%}AIdg?9qoXq6ZyyDa<c&^heEy@8^zwq3Diz7R=vOK>irT7=4&Ml4t zXf=C_3z2C-MTlXM2FRD{AVL$AX+?`bfe$Vnz_}Rg$Rcx)yfuih1QDvBfP%UXQdShH zfrOYrdEW}8LL0;tKrfPRu@)EPWR?`!fMhvgZYnO)0%<{W2uqO;NEHhxF&2S}h9WbN zDo|YmiyLs_;YA5~4^Yg2T)@D@!NkMH!^Q_LL%5i@7}*#hm<v?4FtIUlF@jhEAetFe z#&9w6FtIVRF&4Rj>JLy-2c<$@1_lN;1_lOj2_whEz|g_CfMFp+EmH|&7E_U2J3~8T z8n}fGDqZq;pk)mch*!g$!cxLq!_>^!%*4o0!<@p}!MK2BAp?}h*1@=d70zStU|hfk z=W%o}E?|f9m`XT6<xn<5(X1Ng6s``&1)NYB<`nJ@#sypuUY=13Pc2J@P7R9-L##>+ zQ!Q&PTM2guV+~s~Q!RT9dkSwhXVH=x<{H)-c907SmxP1d#Mi;NfCpki2V)j*(VH6P z6n+p3q^3flgE5P50sle<7lv4&T8<j#6oC}M8V)hA9}0hjGn5E)FfI^W$k5DK%LyvA zYB)jqQiK->bucavUdXVJv6icbYXW1DQw?*9NDUWAwg%=S)(MP71r-Jzj0;4-HVD*m zgG#j;Zjh=8jD=C*40#}PL^~K#L?NmcGBbi=03;&T!MH$dAp??#cn9MGaTF1W4#ou% zC?b*_j0+?oA|+BCj44vhpwjeF4ReZg2V<5r$mR~lESU+6Mc-<eQ)EDFsF>^orXr~d zsSd_0Sr>*_fm)s#<`mf)9+2z=rb4!Gh7{gl22Hst)9|9ql2mZ{8sP1&>*?p_uK;S{ zCYC6GDtLvGe6%8#OF=<F0bZqn5*|AP0|QDCmcm#A@-|})<3h$XCNYMEjEoGRVhq%v zV^=M<Qcx}C(qy{DS`M;0iWkz>Oof!FnoPHtvr{XJ3_;nOsmK+Si$GZmxc~<1gD7tS z<sgtF7#ORRA>x>2FGL(%V52yk73OeI0})jAf*f9h+sTYY?hsdj@-4)Lj1U)s@;SKN zE%IbwU}#5jlz=a^siX^S{@-Hp1Jy3<P;L}^Fr*-@;`D%(n4qH0=oXtJxL~c~fzXh0 zRg*=NsR&f-6oHC1O(s;?B2eF2lPQYJ7v4}R0+oK6OjQC1A&5!fGSDxI-3L}UyFi;n zx}iZnRonqZ`JfsV%wbb4)=^L`zQyf=Xs;F7GB7Yiad<<E?OPnMuF)+nXLv*F76-IX zQhbXe0NSFv#pw@glNBj4Ffdf{!_?>ofSZq15=hqQI_KwsnuWR{l?AC)d@w_FT|v!4 zO*wG;st8o--C_=iG`huHTvBw41JqmtSK-_s7OckN2XT;EoZ!YNxcvuiT!Pgm=jW9q zCYRh21gV8`pjCzvsC)-2f>vim;97&H01{9jgNkplW|pMp78h}Y)Ph@$7<CFuR(@vQ zEgq2huqy8sxNiopUv6>7LlP{g9=-*3HKG<QhG>O1aKQ$_8@^zJ5KUh8jKpG4Ya1NS zMarP8qykF7yx__Tl5)XyB`DEG@#ljZ;)ywsoK<{_6`W&kv4D(-;sBBHWr;aa+(<sY z#fk7BsG2OY1Nod4+-L{qSWV<C46XtBAfAKe(mGIHi2&7I%p6Q?i~`I&EPRYm$i&0Q z$0)$e0;(37I2ieu_!!w3c^Cy4g_w94xxhRS$;T+fB*Y}dEW{|pD8$Ue$ivLR$i&FR z$N{Q48H;j26(p!a1X%)VZh>M4+`$T9U|^_}D`CiDT)>pVSi>X^ssNa4n6sFRWJ*|? z7{eLzbXXWlSWDPS*h^T_ShBf_yciiku!JLpsfMwJ2~@f@Gd3|sGUPEuK*~5~zbd8* z+bR>)B8A-2;u3|VRE5l3P$xVwDJNAyJvTq4G$+*x6q?2A3ZQ|FymSSP^!yS9)gnzz z&Re{ofGJ8X&Mz%WPA$I0<(gMgR2h(;nOAa)72IRL#Rd-D;#+)<#l@*bpsuhhXzb$_ zCn$?Rm|S6?7BYm*=U4(6JxK-gi$H^Onk=_iK%LW~Oi-Et6}7jRQVYNl1|h&PC6Jtv znw%YvaQ!(@T=9W|k&%f}fRT?;3>?ly<;Won3Tb!<g9^$@u@uGy3^hy(8EcrbnTthA z7~vtyRKi@sQo;xhStn4qGBT8~Vhvg5U<OT=Dy^{8qRg~Pg_4ZK5=bvVA+uN^5f+S~ z45N@=q~MpImwJn#N);&z5)~klX;8Jr@G$q&WGjjX1w$c-C;}11Afg0BfCG!Us1(G8 zhZQ7<;6?r|p+s;*#6u!89%Ru?P)LC^GcYkRih;was1iApK+RTALk*k`GZ+{cYM5%7 zLEZHl#v0~kW=4jJpc-ZuhFGs!mKufyj5RC^8H-Iyz)iOr7BL2K22iT2VOhYO!n}|% zhPjrtmaUe(hP6nnhP8${o4rV^ge8l00b2@74NDCxsL@d<7S52u8qA={R;7U)ilB0` zxF9h(RRJ=plUl5hSd<D1+{~0JL(l*hZ0Jn^TpniT6)WWBD?pNQF(|a*`qJ`?6sklp z3{+4py2Yqh6&LOp<mc(<Zl$1F1d6qk)a0DRqSO?HL{JPu4N-vW)=@|*1?35l(!Bf< zD}{ob)WqUch2;FAqSWLP$XHNjo&tE}MX#XJPm>)S!nXu65{qGj3B~bg`9<Iqe~YWA zAhD<<6O>(Uae~r5c<k^Nb54GGkrb#<<Uot%DDJ%Cc&M|AZ!zZ;7u;eiNGwXtE4js7 zoLX>;H8~?QCj~t%a3+KEOkQyTXxzIP)bnIuVgZc@Fmi!23lEb3BM&1RBNJm$Gjf6e zWgAd}0VfDhHC`!E!cfAvfC<zl2erc&GJ!^Q!x{3FU`0|Ib2e9z6*Sv$q%eY#1hgOm zjhr%9X(LB8q||_o%_!t178GRWrGtXEEHNiDrK(#URfRgd_)1g&jgV&M=Oq?ZDwJpB z7lV@rs0R*8DUehTP6?otU#yUi$YanH1F{Efi2}6h(1+H^3eb8iH#M(B0Wp@S=cmbe ziv?ubEzZo6)FSZU<1O~$lEfm=ASq8gB#^=GEs6!@O>(j=50WXxUy(Dc1fvKjemX$$ z!vres7#J8pZADP!0gfL~Rae8XfFXquocWk)nQK{USc<ej@de7Nka4*h7DzS)6>$q# zL5*Qh41ycN%znQZt*T@^^B}>Jnpc)tl%EF<hTO!W?9?JF1x>bFobV)Dlnbg?`7$Bu z;~{Fm3A+f?0=^{#t{PyG3o@rzleH)tq=}^{wXhh{FKz_!*`S)i<rkO$74}7-HY+0| z14A*WWMTl9?mUcO(PU841cd^~`=DR|2LY%DUBUqBE`mz+BBc~Y&~Q}^a~8N>OkwI} z0wu>3NV%<voDjhy7NB$&QdF9%qu>S_<JM6y&;gYthE)dDpsG=^s1_;tfkyLF6Z1fY zQfVrr;I0OnqF7X`smX+>#r!mxZ?S+>gM;Q48>Azn$%2-(Z?Tl*7UZC3U2bSG4${v7 z3JFm8%)rFM$ii3z8j6L711JpOSv3pPhR}dyRZtxViegZfEnz8PO=D_iDpD(9gJjKc zhCCY<22fifjVYU}D20)smYI>EN-Bk^mZgNFh9!#=RQ9JZLqaZ`A%!J{rIxvlIf4P2 zsab*<G+C=Gk;4)?5Dkm?Vo<Oqg2E{?1vzgOgKNJk`Ov)lqLfrnp$i&ig_QK5(e=cf zoc!|Cl&V}Tfe*>wpvVDbNGjxRYlZ4mP=low8gsW;!CXI0E^t}~C-tHpP*UZ}ECzcp zFF6&|UP%U*yd_15%npi$q6whVn-wjJizb7Lg^3^noW{WfD52jHf@FK7lBbv-6x-l- z4HFZ%?a9L^!o<Q{G#yj`z*0X-tb>NsDg_`dM^LOYGC*UOA&W5!R4n_zW0$d(rG%x1 zC5sgtyU=_Q4jPtcMu}ZWPSHb-U2qylj#5~$2`?(E+;GPjM&XO0yBIwxz@Y|e5P<^Y z78l%_;#)kyu$i9V)RJ2Q(1Hst2+nV$#sohkCg8Tnf}#NwrJzQW03-@#BS!(K00PN_ z3m|YEi5>-7EDR-};J1PXKTiou4Kt`93J1-iFroxFXfA`P3Z-aD1vR$g3qY;yVo(hU z3VU$L3TnIiX|h7nW*#VQg39LN)cD-Qf+BEp5#%n+f`%~_y_A6_KV+LULH-68yG)>F zwE$z$JY-*k5+DeJeGO_*fQntvcwRG8u}BFsq;LV(DolP=(j}?ICGo|jpfMd-_XE~G z)?_J~0?H8J?lKP~UxTMxiowyRNvNF*?GGSqFa$Xq6e-||tOdx92IUq`1_lPOqf;Og zSxhC2%}hlh6&^KA3z)z|XcjTxs<VWlhPi~fnW<PKfT0o;Wh|glG@PMO1k}_)^tu8V zA{h!rA{YuqK+ze@P{LNjn8F09WK%%V$z0`tBmW?^VDi&oO<hQ96Ewt?o|B&hE+dQm zsyvZu9wcqB1{1VNh|miv7QwBa^30r+<iw&Bg@VKq&^&3eCOag+r-DKq+)fDrB^?$} zn+8&ffm027*>#IC`xYa{Bos8^K&_7l4bGW?!XGqt#lQrbbb>Z88TlA_m{>p!m?g+D z0*WV4tbk)ghk=2iLam0$g&|fB)b9XIzSb}=WGZGWVaj4&z>>lQ;xRIS2MQU288n&w zs<>mywKZb&V#>8OwW^|#Tl3&51X}Ar-3JaHYgnVbv^Z5EKQE_JK~J|hwIH!5u_P4~ zN}$Q_RItio1*E3DChIMxqSRZgxuCh~qFPYkfkp`+&2)^qoV_4B9n@<;&uDy*(go_C zVh>PQfr6WXkqg!UUjYgqP|F5}L16?cSBe7|85mL-q8L*cKnqf$m{XWiSyEY3nCCD@ zv86CYv8S-4u(mKnaisXBu%)oKFh+5vaHMdyFhp^saHVj!Fhp^u@}%&j@U}2CGe+^I z@TKs#FhuczhND{;qWDw%QiM{3TNtARQh8EDQbfV31XKJ|#8Sjt7^8$z0#YPXq*@rG zgj1wbWLg-aL{el^<XRY_L{sEb6j~Uf#8MPflv)^~#8Z@0R9YCKBvMpU)LIy#BvaH= zG+G#<q*63fv|1RVq*Jt0bXpjqWKwif^ja9AWK;B03|bhX<WdY%j9M6?<Wr1OOj;PC z6jDr6%vu<t6jRJoELs?%lpxD8qLd*EGNM#cY*Xx77@|~D>{A?C7^2it98;WH7^2iu zoKsv{7@{;%TvOay7@{;&+*3SS7^1XNJX5?{7^1XOyi<Hy7@~B*OF06IK-2z-{rn6J zDE-Rv%#sWR=t>39*t0@fYGO%gQEIV{0;sGh)=@~zLnIea!sh}HLWh8s1AzMfc?zj{ z8HstxsVNGuIxas=K^@-9(*v>eknL0l4<Ud}Nli;jO)kkSOU<cNNK8qAOf{zEgIYwO zeoJ0zxdLopOaVG#r;u2bUJ7nxgUSwda2HfVQ{4*UECqFNqa`N?-YQd9(A7nZQsfsY z6sH!JrsgH5BDba>)nFyaPG~O)>^#tDJJeGkrzL`VzNrcz55fE8(56hWLU~4No&wbJ z)D#_1o&wFALR!Ia(@Kj|QxuXa71U8in)INiXlSbIDJX<wq*f}FXXfO9hp!;39a2-^ zMkJP&<mV=qWP(;@fVzaKdEf~IXkG)=ns8U>DJXcRDOBc{DwJmyXMn=1v^W)R5L5@$ zXQ1vRxGX74%*+8*xgZ||R0ep0`v&ESc_kqI>6vAzAOnjON{dsAiWL&`;Kn6_7SH4* zmZU1c=Jypq^RJ*zzYa)?LULjrD3TQt71Yx*^HSn-GV`*F)u9m#GQ1=M;W+i^)WqV- zc&Jxm)fI|C2_-)d6l<0FrA4sbta`BmBn{{#r=_cd=c6G>wj?7J;Wlt80rzAf0b2}m z3n+R(^+#%oLV0SE0%*Fl7@P&b4g)7rh2q4L%wq7M7s6@K$O5N9Jy@~>_lJvNsScXx zu+(6n(h^)@!PB)8M5_{d2qdPYfJaOcbC7!z8pWCrmz5TSQfmo#L;zxfLS|laX;HDB zf?Ix(LTW`~Zb43}4m^55>vybRxdfE36%-U8`e2S$umz7bXcVOehbY)8L@TA_CxZuS z>}(D6jFog0lt416DVZfov6@hSD<~*r=A~pNCzhl_(-A0CQE~_<s9~PXsRYFvXmN=` zVjjeLxC4_D3lftub23XR!3&O3Qy}&!K?b8TLCcWxAQf3sDk$}(C}gH7z?=vwrQjyP zoCzLGgQlR=6i8+OIS-U{VOg~plr)RrjS_IE!VPjwEUxr~WI&Jw;CM(aE-6;X&jS}9 z;DiVXL>+J@1P_oE7v$%GR&T+L!5)*vkfaD2qJ~(J3ieT6YHCVq3OrrGieq&JEv*#j z%CpoIEiFi?h9!YPf*M+}m*m480m&ucJfP<WDdW}Ql8_Y~#d-<~P$@|FG*JOGcAg2z zb)b+#iCFMJFerAD5P2grFFB_)B{c=qWlgPsvXc@)rCxp>DAtOg`MnraLYAZ!=|VlI zkdj)EnwOHAmz<eej7YVh$|n(0B0-WyKBTluE-eC$1}YR+7MG;v>M1C=!YqTD2k}6D zZe~ddQrQVvwUUzq8M#zQ&d<$F%u4~g1>{yxj)DySgQGhs6FlmM?CD}1g<?dQf=X6U z03;Wsg37(z(wvgaf*jNu0=iTN6ne#pxv2_J^Gk|SQ}y8C4-Iu_tQBYEm*%8^N`J@* z6=Z5oAu}a4uLQD&N=G5JB004HR3AYqrAmd|#7ekv(B3CFNvi9rD`@0q=9Ly}Dimj? z=OM>2$nD_t2l6~>q`}Q9%S;5D0}U&MoJ>&K2hUa&E2!)0f*KII5$fOogL3mrOLQaD zbwE{OQL2J^gt|gzG2A>*K!6HCP(co2L*q+NK_NUNwIn082sGslNuQ9q4C=O|N(JbW zQE>SVH?JJ33ltZiIt)6T0xC^G!BCVBTe?`3pNruU9b}h*7GD<SX68X^Xpq}r(E`aH zdI}1`sgT)vb*PNG0(f>1Tx;a!7a`{ZNX4I-p9jy%p!O7`cL=T?Ko-CPA`#r!Qh;<F zOY#+pO7p;Gg4C#k^r^$rDk9Bzrh&Z!F3gHb^NJPJAu9kOX<M(L5^SbAq+o*9^_WEt zYE}c;2Xa#iSTEE)u%<{+DJb!TWTb+emYY}tiXM;#aI#KB#Bez*^@1Ba`FWrUzcde& z5y2}m;a&kJC2)HOY?h8fCd^29<fi0<vM)GWfYM819(1i4D0U%JW8icLY6^jb(o^$N zLH!#A<nV-tKQs)$y*F?Spp2~(?qY(L7l8r?;nVyg1yJX;7-To7n^lsp0BYGl7H@!* z7sKXlKxI3m<N}!hZ%`LwL?=>-o{?A#ZqI;pfQR@Yc0rpgrFki-MGERlO6m$4pjb%F zEhs^h0FVI&O;F^6rVJoPz#_6ZHL(b^5E&GYpjKXLS!z)wtO^8`%b;c&xa|Rt2+&HD zyh?CHK-x$kD<Q4s%w(8WJp~1q#1hD&K#;1^yc7j+g$hcjNDWW0YxE($fw>7@O)DgV zX0;VS#R^Cp%xti;z?LTFBC;8*feD(&0!c!nSWiL0FCV<HCb0w>Luf@qQEFOh5vUh{ z@L>jMeha+b0o*>z%g@t=8mCZPnv{|Wn)%8v0@Y3++rW-Y1h*bQ)tZ93zPbWZ9!La@ zLu4pGJKXt2dI|~}?m78MkZK9F37?#wSC(1?>Xjo^*RT}{x=4Xsl2NRXSOO{>N-}d( z^`LDqPjIUm99^JvSdx)ioT>ooIYB#2pq?D4vj!=t5_5|46+kJg7!>P?IbfB!sU;ct zDUfsxnn=t|%*!k&%}Fc)RfwQ)MXmzXA&ELQuLRs)Kx%7(<4Yad1kligG%r9kxH_~c zprNS_T1X1A3)~w>0+puurRf<Z;M@%wh|n#_0nLXdrlf##c5!J^Nl{{Q2{@XdRS>kH z2~v_@q)?Qan_q^QK-GcGj)JPllGHrVqJL;7wm4rQKM%Zc6>J*1zrZC?Y9+YQ2rjvj zKy%%xunsXO5kOiSpiqXb+y{98k{pqP2%ND%=0n2*;umNjq`*vsW_~|SX2|l87|>t~ zXpIPbofK$D1U_s8T1rvFSR|6dSi_jjUMvEds?TPJtWgE6;4fjSVN78Jtyf;ixPTeF z?vNo1JP{2VB(G(zfviK%s9|2f4w|?w&M0A6zya391kqK)9M4(9T*DC01s>64@q^4< zfmW$haljU+X>x-HVsCL4C#I#wgR*iFcwmhcG>cJmi@Q9(C_6JRJ-#@#<Q7{}WqfvO z<t^s))RJ2~pt<2(=z^?UJYen6&h;%0*jn~myz$Uo67iq_)r2nXWChJj6&Hb4G(hGW zz*7of0z9uE2G$gxn^_F%6~%)(*O_@~`3pefPN3m*238S97Dh2fK1Lx%5ymQI<lzWC z?0Vsm02;Rfji!Qzfr~GJ7mjx@q%bx!)iTvE6^mptbTGs-)-V=GWir$<f+K~kSSN+K zhB2G1$fSe`6cvmN=^#}sV707ZHd_tj0?<en!$PJGhIoz+h6S9UNlHcrusCZvM4SuE zV}tUzD^yB&7VxI9FJyFKh!v}4F5&B7Xl7i%U&EXwkir1kzERi~&QKz_K&S(<tQ|Bi z#!&-aUg^Tn%m`9Z5!1ntB?4M->B11}7sFJ`Qp;Ll*1?b^nk5EWeg`(0t%jwBEt{?A zK@D3CizGuWdjLb>gK&l#&@xQ68rEipJf;+eTJ{ogkiHt08g|gCiNaIi3?&jEku1p) zDbNDR35-Q{B{C3^W=0SlF9{;EBtcsuCNLHqtMn+5&5~Ro2N7M!Sj$l&Q^NsTA_@_y z;ml^9z*sb?M1Fxn3KvWawDJeEuCay_BoZ$f&X8xo!T>TUOR+==G{ZN6vFHeNavr3U z8>B8v60#Z+GNaeQut0es19WX9kKZjGXkia-9^B%9HcN|d2|&C1@o*82;-cjEqWt`l zTLSP-OC@A9;}#!yqyg5WF0PUQrDAX=S`Q)vE0p2u&_T%xl+VG7I6<2sG8t+ZVkKgj zY8h*pYCwU;kj-AiQo~fkIGL%CC71y`)~d;POFrJkGdLtP#M37@KGZKbG$6n~D8$tz z-q$t6(Zw;uQIq)=lb%7*B2cNa7&J}C2w8as&o#feY(TAz<ow(MyM3UX0&)guS#y;p zO8$tC&&<m#iH}FDr$^|klJLtf%1zA4tO8XP>Z--+pwbaUS1kjz6rmX$zP=zuK|{4j z6V!4{1dWzK`ZrKTpvFojXzHgDyz2;5kbr91)QW=CWKiu0ZW83BmZuiMMjF8tH8@<s z{aPJ`g3JPN??3@GaHXdZ09m$DoSLc-;2NM{VqyR;nL#aeg_P8i#LS#xJx!IObWjj& z0nHAuL)-PY_(6M`;t?J0qHQ2GTS02LKv5bGZr$BtF32w^+76Q13?g=bh@Bt;yktNS zG}jQ1Jlk}Or7W?i_!d`jY6-M611@53@x~*E_$>}tkV6(&>;hTK0WUf^;^RT_79W3$ zy%@5i2Qt$EDyMI;=auFrr4|+6V)Fwtz=d-Ws0=Lf202U;M1a=Z+~V_uENFnPg$2)v z+!BgU%gh5sXDU1mYjQ!-%_h*AQ^AbHvebCwtWs14avd9F*x?pC)LXaMApKnMLfu=; zWvN9`LV3`Xl9~c5?V(8-Vm_!KFFMM=z_1pS7D1D|pxFWzMm9zcMgc|+Mo`LRV*)MG z2dz*PU=#zblVBHN6aw%5U}FNUOcY`gVB!O>kK<tEV+75^urYEm^Ds()*vvvqRien@ ztOpBbcxD7GI05AX@H`D@bpdEq7-+L=Gjov`XzLefYfU^OSQNDRi@7MQ!l;G;G;0H% zQ&RzL9a+Gd!m^Mtg%z^nrAQB?CyQ+XJEVLs)C*^*VOYQcDtl@eKnwI48Neg-Y*h{5 zb_r-~E;zMBApsWQdXRn{JVFw{Eu*x|3I)uiE08uE$cW55g#>7$8ck;cWW)+4nt<qo zfY++}-Qq)4P}B)ZGoYZ+<SGKK#04uWItCKG2#S1`?9|HQB2btWftoM3m=jY{Zpnbw zfq~k!&|PFO>%haNx0K>Rtv1;3E{Ys<flaX{6C_=L7Sezd3WNYBlQRqq3@<>*L<lr{ z#0pxF%EKtY0*Z1WCJx3bdDLjeNYn5L2Q4#!x3CHzQ>CEUYNlr90zOcMUcy+y1l~Kv zToF(M-jm_N5bF}dRLfM$42t*~CP@ZHh6;lc)&*=e%;1Vy3A}8O9kdpymKCC=hE<$F zl3@V{NQ{x8&?%guP$e7^?aWmR;nD64=?Q?x88eGg!9fM;prOYYsI?4gUV_FL;F=R4 z1IbEO3eieQiA70?RfVOc71j#XkTplOO0fwFNF5BQax1trsy?My<a7awW<O0%NbG~Q z9DrAg+!Bs2$t^&OUr3P!D*qtsNVwyROViRaD?qCOZ?Pp7fJXT=*}zd7#S7}(fb@eB zKryH|1Me;^0##SH7>jPPL9{|59$s%1U14Bg_ydZ4P_f3q2HKG$#Kgr2qS31^Xx|EC zM^Petcpe<E@H7CL7z5S9pacwFG+4us#Q<t&moS1@&5Ys<!LYc3wDm#x3pB`{h#XTo z3Pq_UrA3flzB+0aQdfZZ1XTUNBMdx#3T<70T!fSl!8xu1RB1C6^?~vksEG~Q4Of&} zh#nf(85kJ2nHU&~nLv4gtx5tl?L#aEg+AQFpa=vddXT4!L8}r#C0q+bEn^8o2WV{! zOEYtUSPCm>;}WR-3hF*IGuASfuz*(4G&9w*lz`XMG&9w*mN0_WRMoIFGlAN7@f;Ou zHLT!yZMF`EEY1|R680LlEG|$GN-`|qu3-bU+6n{08A>4ApV(74S~x%|7x040&t^uj zDSRoQ)mEHUW$>W#1$FU|f(q1A#8$k4gA~-&hYUL)m5*?vAi1Gf0X<J4LLVMZpo9U! z!3@x)d7$LL1DcTsZ3hHLj3#5z9Z>v$6DODel~1>LGmGPkGeHwDpp-2Oj~&J;H`Lf6 zSPCK<T_{H05<oB8AsZ;cWi{Lbpa=$)aG*VL#h_&eHIV&Y;Fe_yLkeRH11QR~7;BiC znLr(cG^Q{HMutKraD~JSHwTomK-D5RAV53D(?M-i9#Db-?V+8B+%5$-I5e4xc7uZD z7Ki``3zz_f%`Yw+&<GZ|)u{;!7&e9~U$O(n1~lwfQBY*3hcMYslc|UwR5x+OC+DOl zg11F$GD94Nr$x*OHw*4G7RD+k%AKak4=FoA3r4~HXK>+IBmfE@K@b6QEI8<j?t!@1 zKm<7F-vF@?i&#J<u_imX_$;~$YLW4Q%TQ2i0425JC{6^E8<7Nyqj*3eo|9SuR#gO# z7)@xe02DPvS3!HSKyd<I*TTiY4BBS^+FA|T`Y6Z9#K^^1rB7mD!28jlL<GX%Viwe? z1`TAyL-zq!1;8_?duCZGXv`S8GYM2Of{Ip9PQljT0XK%AC2wX4A{YB<GD31Fv>AaV zn-)D_U|`S%`4^P98CcjDtHe=#2Twb2Uw|SDw1x}p3nnH8aAP5dA(ychba(<&7ITpu zX!U;yOBP!;bCF#NGibF6Xq^gZjS6Ue3TR~tXiZ8wZ!L2kOFBa>a|t_WnOrS%4P%Nx zHb+quq;*)!Si)J9QNyr+3$)dn5wzNup_ZlMK@F(yf1{SQgnI!`4Qq<fLZ*J7TDB72 z8qiSz>?NE<E5Le$L7O)V7Nm&4`pPBTS$s8YHS8&(y-c+npp`~NhiX`|`13&PBLzTx zZqPc)6oEj7AchErikuo2&}K~+hS-E!&Ki~lLN%P=4VnxKguyKC3bz_A7lv57TAmu7 z6tQgPqJK3!;N1`ZY8V!X)UYfNt>LWUS;(}Iv6i=nXMtFXc#6bArdpmF)*9Y4rW)=V z9vg<jf8mgE1s2d|Oh$&nl5mC;$r^?%iEOqBj79${7J%3(l9CLdjhHSBv3)U2wLCFQ zwS2X_H4Ir&3q)&p7BbfISGv{kPhc!sP$FH!P{Us$Q^VWL$in~{lgQJk;YpDKo3;lm z%L9=G%ke-&YIs3B=zb&FY|s|eZ;TAJ0*nk*JSB290?;Ll0x1Hu0(Ang6~Pl23v<F5 zQUrn-G^MK+!&9$gN@4-1vkIPR1oadloqrGuWf6=XcxfZ3jhvPV*{+T>>j|2xhYpm& z=F35Yo~a7psTSBF9Esq$a?skX(xj4{O5M!df};E~q}k5$#7gKGBdEbr1j>AxjJJ54 z!KaP{fKDJOs^S3^7og)bK$Empuv!H)3R?me;fBfQWF}Sd!#JSPX;gvIqEr-tjMPNX zsU8R|knQHh2n#`LiEgnK6s4wRR#b7PR-`8DLO8crK-<@Ev4Cc_Zn1y{TKuY%Q1T^a z*lB25-C`<AsuEOC0B!OH4MwOID@3an$KGNCO%mjQPG;eNovQ-sV1q_3<KurZ>fU0E zzr_Zcj7ZGUWV!{~W1o~?oO+8rrKmE#s5DPgK1u^I!~i>mr8u)f4^$!*>p@0>!7eH) zdIT!0LB#`TN2KvB=HklYBG6uxTil?)jEDM<Gp#7U3bZM|<dz_4z6d216oFc1w>T2> z^72bTYp<Cy^KY@_7o_GDftH`%;tffyDDm_UF9Nlsi*9j(d<!0oxWxuyrWM@cfUcA& zzQqpdlovzxF+w=tp@Ul-@g+r-pgmJXYeAJHdr>NQ*d5&czQqq6XOD;IC<eFaZ}H@% zrYC}yYJr4{PJlcLDm5Vsa6t_XO+j$2bc+)-Gy)3UVsLQW;>%3W%P&d=Y0J#dD+X`m zDNZfA#Q{@yiz%(32z0g(#0#lKMW7vAMSnmp<H#>4fjF5tzo6t6b6H}}E#~5)<XfzX zIhl#YNCz*#8yL5Q<H50k5~?PkQXV{}z{bNY1m3*Q0a~fa1lp&_!NkJI#RS^)&j&uD zfsGL~ilD#<8fyR@2Ot1GR78Y@hn0s>hLMMniII&_1a#C0Xv~4JN&zKpVzC_Fjsi6% zL2He{l?SLj23o{k#8tx(%uvZu!vI>C8_WP*MXd%IzJv@`f>dZSCMGd5Fu+S1|2zfg z!T=*3h1}BQ3{bBSRL+1)90gE*Oa-k}fo{43EfEE68%jzAWsdwbxH+KR2ny=OB}M8A z8cCHUsl}S$DiyRAtTZn(IX@*;p(M4UL=Uu-4Akj_ER0W1%mXb@0FC13Af_F`87wsg zGzJJZ3Nif$o4i*5E6L1D*HHlFhSVbPY9`nmtpaEj0A$()I*<fcZ?E8#nw$upWkqa2 zgt`LM(#}lIEJ1QfN-D_ZDGEu6$=M+1fV==&Foe3iMnOR#C^bz%+0e|?7#<*+EZ|Me zMIS&3kPYnK)LTNKkg#wC9nA#U&8f*)#Kj0Z_XD2%ivBS$FqDCk8@PAM!v-39VgwCG zu`!|#KS47gd~*wE>m~?;(?<p)186b;bb<uv%o)aPjv^`Wc0}fdjI~T9Ohr013=5b+ zi-jS>+7lQnOlp`wyVYD6CNRdTfrj>>XFD(z#evl_gNF5MSkssxIx0m#jguCJ8pbSE zQ0u>zJ)9v=0<=vgo2#e`lK#>eYS|%au#&5WF^j#H14+#~h?-1>S`Mh1rV@@Cwi3=P zu4X1sv!R9~o2}?k4QJ7#67Cwt8V=B8LJ1G3sRFH@{Xmlk;Od#BhI0aA5erxy3q%d5 zTF%oc;jLi=bucF|7Rf<mYuLatLM41DY@jWdH7p<>L8|FO3l@eFesCoo$H-921+K*T zYPcY>DU2zMwOn;vph~>ZB7&jN0<xH0lRfb?a^3=szk$*^v;+io+ZEK|#bQ#HI(QmU zK^-CwE}%dwH=PoTA<Hu1X$e}BC+2}BO$#bPSuZsQI<S+Urhu{nK?B7&P2|BE(DWDR z5H?VTP6I8S16RbLMXVYyXQ^u<Wg?hhd_Ksnh`k8TkOfbW#cz4ZsgN~sDE5NJ=JWC) z6Rx0U188k<P9|tYYiTifjbExlaY<rc3TUl8#QWe?gU}s{pxI-vpP_*T4+sr#gGe28 z%99>c4pt+exLm_AC7-wk6ljJq9?d9CxP5+A$_k*BFyJX{h&w?`5{eW+a}%(|G*(rj zATO#GE7&Ti7Arv9s9LNEFR(#PCQvO$RL2+8(}s3@Z!zYh57XRdU|?7XDi%OyvN2Yf zqShM4sU_&1L3I5Q{n{!+@O~}Opdjch52*Jco&wG4=jAIDgR27Y0xht(rob%$(1{07 zwU8;>zo7aX)Y2#dZN7xm@cf|7cc8v9G`NbuyRbp~5+U;opmt5se2_*&?GK(h0oDHC zc7P@~qzS+cvnxL->lQb}IB+Jp1?q)@mfS&HaTa9Qc@P2K2G0p{04P-y-(t^8O$V`V zae{_DN{TY`(y`X{BG^(v7buuPhaoWVfDVS@Vq#(BW0YcK0iW*!s=PrH2%rrcT%anR ziHVVi5i~^rspk2ZK*tw=jx(rIBp5|*@S+<O2B7c+7u}%qi9lmTpb7b2Mn(qEKq6=s zpoS@hsh61%H2%*F8vlpx(2NAP#X%(m(s6*`r9aTcgJp?Dnfax~3OT7|sX2%te$dhi z&^c;oI+4l&O~xW7Mg|7Zk&P&=uy}APD)s|ab)YIt925r(AQot3U6UCcjbN=sQXo-q z?FJ@5;{>oBuaKrMxb<1Q6BOp4whaR-=tMS*F?h@-8A>Jt1s^!*Kqqm5Rx{Lqj)MS= zzcLj`fa)$#aDk5uW2`a`D9TSxEiQ(yqfkgpD@g^d;VlBq{=+giczGFYwW%gc(GgH} z4&AE@OP`>{j78vCJ*0^**hDXM0s_=3EiTO|LC?@Kj0_A%;JyZ*8imu>;AN(uDdJT4 zKmw>3fF~HxI1p$!WC248QwsA!CeVnpCQFqyY(fC)B=GtxP-`X`v=JY+&KT-P1$ZR^ zRu;uto>`I+U-TLjwQoQ}$&5w+K@@a6!~i4?j#4lIj#ok0BzHW>EKnQ%G{}P>r!p{A z$)RQksGHzQ;XVTum~fwgc58!Lxmipl3=5b+Q()k;5*a}mp_Zva2D}YQ1hfq*i!qC} z26XZ)b1xGkL!m-ALk$!7;0d{))Z+Xc&>EkjR9$da40+hSI7E}_7I@GrF()Ur=$0_F zF9UA==VT^>DgaHW*V!OLZ>vEmfgN<tM^0HPcp&Z;e_Couaz=boX=YAJd}?}n(PdCj zK~|rD&pnIcgQ`yfFH9-Mx(r1C&6MKvpx^_y1DQb6m@JGOOkAJ^D6%L)iLMKtGeEfl z9+IG4xv-o8Dnhc5az=$m3CjXj(2jT)hFGgw#uBy~P^*p|bowM{nF?sRMUhGkV-`mZ zXjq;JR4CPe&jW*~t6>7Qs6ca4Ae|}TQ!9&_pshoOEN)Qi5OfA*9$PvChz73@V)Mhj zyg`$(2z18cEm7D6j8RFxaePXCGH5YtG2DZolm+r2xPAroZ$ZY#3V;TdLFdANk_+<S zGV?8_{Nh_I1&JjYx7ZVtia`u`jf;MSN)f2WeGZBMkS%PCs0V83!RG`a)l)IH+E$YX zQfdgGD~6OAa^T7bGIRi{tcszh*Fsh=7ef-;K~O#e&zgdA+%0zKEJl$sBLl-N7EtkB zqzWpcp=B;;HXS@^j$Yhofz*S10}3Y4%s3k(2NP&~7Sy#6W8`6GW8`D5LQ7b%xqPS} z;o%O-qMWcDq97|lS#$wY2}2fh3M1$ML@=KP6#m6UB@B=Q6c`yw;Ir6ZdC-D0riDzk zOeGvOOexIGO#LdLWo8RFLG$0BW9$}irm%u$d}^2%aHfFge!>}27$75z;KH2UuZmSK zH9ft!iYv&~(Z$zQucV^n7Grr;GI)O(Y|&*UY#D8_0!T5q%cxMET7=kY1X;5UE*!v1 zK|qBhI5R`Gu|XDvfL2u(<dmj^j*!*k;;M2)w<Iw+1Kh*~Et!Q_ln?5qmVr*lC`v5= zE%Hx+?`|pv8KLiyUk+MG30u4j>JNkLPDuqFe5wF$3d4P&$Hk?|Rip;0P}M<1Jg6LE zOD-)+$t=3XmRgZnTvB|CH8(pYv#3ZEG`7!~k(rVTu3wA3gOU;W1T;vY6vdmGo*thJ za&df0W>J(dX!IvHHNK>x1grs6c;8}7LrX=Fv$arkz6GTz(3}qF+zH4*s(hd$Q<%7z zM9|B8P%{!mGrY_P)%>9LA-E3T$ACI44jS124TPsNW-=~h1Sb(@P!a*1+X3pYGBVVF zN-x$Fwia;H2qXtO;Sf~nfRhhH7JE?(=)Bw%_7wJ3CP{``))bB!mTb17iW-&_4oQX- zPDuvP9D6Nm3Rewl8WTv=24oh;LWWwl8m1cN6z+7!8aD9YJ9`Rm3U3N{i)ad8FE{AK zL&!3W8ukU?WAlO;H2JF(+(0z~sIQfpo~{5HHURen!O05L9t9OEpz&1XjcT{JA>*9! ziACwfMJ9|$#|wiBa}WmYST6<@2sI3`Qm|!SDWIcZ!KZh?r{F+)s+ly|ZgGK!2*G>O zZgCc8mZXB>yBJjErKDDXPCmN@8YIii&8$i-GG}C9h~frsfr!t@FD@yD%nD-6e4!<a zqKBYkE14M>ia~uC(2^S_CbWqjv^ol@w1myR`4xe-L>GZpWZYr}=fqo#6(Me#T(?+2 zfpH5qk_>Ww6hCw^Y&;~mib0MB4Ohn}=ND8)@q@z{q%bwPB)_Qg76)k88E8}DE%wra z^rFO+)F|HE(wve^*h-=(&b<8iqEyg!rJ|>xs+%iH9_$8iX#neS>LEuJICgGv#>ayf zM#sk&f%-(ZSV2=hMYq^W3sMqGQo$XgBJi><V^H}kkeXLqS_I0HkVR4{njDa(GI(|g z6y4x<0cgM$l$F7eR%8p($()>veqIr{3it!cexUvW=&%#e3I@<Ywrq?dY;266!AQ_~ zMW6%KK$wk@545&L24C9&Uc!S)cTi-4Gvp}-28MLd`MV5R3=0@ROM@$Bfchh#wW%%) zv0adp0BRT(uz(t1pjD!v3<+w2gR*88Tai=^OBQ=AYYI~>TMBb6dkqU{{ZerpXg-OF zp_aWCbk-HKIA|`66_gEY*u)vqm{ZtlAY$xbF?Ntx8dEK3Jt}7n2Pk8wuz*y6j#dWI zHVlPQ;S8X|uCutr8CXCK4bWlA+%-&KHi*vyK52lX%Gxm{MFF<=NFTxg?>d6Eg^LwH z<LxP+_1=)GFEIz+TkxymQqX{oE@~Em7Fkq*o65RX9MI+33RN7Swlm1UDh_BuRnX)u z0(FINv4B!2xc&zxj$1t7MgX)ie2b$Dbe>aUNh%~$=I15m6oC%Iy(I)SJ3gs09%?zL z$S+CFOS#2|XhMKS$fNk7rh(cNU;#duKwc{N_<T-qqKjfm&%ec#mk(J&$PQI=ixqs# zVia3uUUEumS`=Gq1&F@IoR?aTp6#_685kr%*&b9JF))Kh!9~DjKWMET3nL372O}4= z2%`k3(aI#mSf!1U^uQiRI32C^15b&dwg#w;2TqBgW1T9zKz(CSI&@)(wSks^3=5b* ztqoA+P;3NBh1ncMJT>6e(_oqfni|1vkrePz^@Tj)3>9WbW@(_BRUA>nw15poA2TRz z7e+t_{aC6j9aB>Dp*skm;Ro8&3_8CD(&d0J@XbsuR!B-MDNluLx6btg7j%$0HFl)r zAPhAoKC?I;8s#ZP-k=hI3(Aep%qs#Nh;WMsnzX>JM(9d+a9kGogNkwX)I3m$hf!*P zPHHg$MH;B2WnckKM1ZgWn8k&A?Hkl##qc^C6e%DKj+g|{F?gW<HmD*J0R?Ieqa;Hx z_!Kly&lJ?mtFQw1*3>|elm%M-#*zZ*Nic&>CkAEGEQT6J8wOCl9?TF9X)ZF<FfL>Y zW`GWLXawYxrl*7a1zW=lnzaD6D_~u6aA~ZeStSIY%7B&Lpo6wSoeDoqj$0hbxhY_k zNR4bAP@4+WtS-_8vB3R(=vktW{x?{ICM!7e++v4X7{#1gPz+wgS`-S>2JQ`m2~d}~ zD2$PT!4(wRpe{P-s1GjC@t5F@1Z>!vM^IBCl?pr$fa-lvJ^%+bXk@Cw2-KB>cG$qH zMzfeeO9ivpi+CW*3_;yCkVp+<7LyGFD6NB+7&0sbw+sBRh7UVZXn=Yf5FaUlyaf&o zzJj96Joq?cF>IU%)B%7f1^XLJfIT0<$iNT;@;qp{2Dp951X_z*C5=)Jpc*>Z{ERa8 z30iqX(ASZm+=s>2sC_HsGz&5o`$!;YAq{A?FnHpI5p)VCsG|+8#h9w(K+_D+Y^e@f z(w3Z43fixvP+XE&Qd$gJ!vr2_l}G9yf}-^n8$<zmaSkd~l0XgzwM-e9sw7dO30z!5 zZG)EqAeHbk0F=a$9oq~Ve_^b041%m{Gz86`K@9-S5<ttd6deTvkPNgmOVLqK2b}?` z4iYQP%g)O$&(martbPJ}1o!w;Q4k{oLmH9?P-j-5RwI|JaDSj=Fwm*&pc4W?6-o-| z!T~k#(rrdbhAdEL6*QX$J-7%az5um)0ap{?MTo3bnxJ(^sl_Fr(-ol6lb;4_On^t) zQWVrdy)E@3P+(RWfr19w$xnftT~MA_4BD>^-x!|>I>oa@0lKd}Cly?kfKL7b`5#i3 zfZ7a2AWszqgK{q@W?|_TlmdzZK%(G`3MN3g^%g%gLSTb<S)h>Q0WAt;2KDHe7`d1P z7^_g5k7!!pnHQ8MKp3=Vpx6a;V3A!7_%wSLhFBxW>SxfPHss*m6sBg#8H@%s;1j<X z849^TeLhgX3tZuH!PYt_eqmx@0JYt~M>T^x%1HMMLHhNe<(r`JOaV=DK)1^v4t+tK zI{{jN3p?cka^8#{Gzn@HRL19mkNPdPjaI5qiq%wCC<kv!2JIPCuK?{)flm~Hrujfs z4eUf0(19Wd{pyHORUJ@*&MZ*?#U^NSJTV8<<wneXgZ8ecB8|N}LyjoOsf6uo0dKN| zoL~W(RLd_aLC*7_nKRI+D|DI<wvrX@PEZ*G-UVDzT9A_p+Ik5++6B}#1%)KYZ%}i= z{Z!DY6M5+%nS7Ab;07UCk_lR@oC!8H5wyP%TtT88){>{74r|E7N5HmkB6f|JXQaaS z_=ER<f}##or-Q;3ZWUy2C2UC(Y|k%f+cxO%mCTY1xa&aLAS(<CKu1D?ml7atDFyAp z&)0!QH#G5Tq~+(^R)f~OD_JQeB~~fbLbslR=JvpLl@wKi!U1F-R4d#|Y5DmYXnH{h z7i1=9fOn{(oFbEvn3s~1s!*PhSOOaJfoy6@%t0y{a`MwNlR*UlC{jSDcz~P$!cm-X z8~rqy!953Xk$8(2E}olNoD6N86oK~IAa-uuVu$(^y}*xUWMC)-<#KTS%rC?!0Gi}t zssi871xwI+P|fhN5>!lqiWU$qP6J=hlENs?&<Sq+6{$h*sbETBZUK!JGk`{6Y8c`f zKxJi-3sjZ`D$59!1?gofN`lI=LS?~gifb6+nNrw-88q3eEQ4@v)&<RFfo`~hY}f^5 zeNaMzZ<H^p0v#6yT0a9S&p<u^l}_M2bD+Kpc-UA9wE3okA)C2~1yojbFfL>)W~pIB z9zbTi#RWRZwxk%;zk`k(7lDod1g-pn?rOTlT#!})329KV3LZwD2nu9S1CEV>iLuH6 zrCx;=I<QSqNFyVlEDKt7YX>h@$#-~B9H<chT~-ZoaZx;|5=a0M@Jaye+Udxy#cns~ z1X*yP$$<hbivbpFpz#500SCG9h7?E4MRo+}Y*-Fx_!i&dLX@w!xKk@iV1+ew!VTgt zke4)>AZ)N7L6LC_K5hgxtQ%wtc!GtQgOQC%f(3%nYB{thg69NKjDj$@S#ARE0fBNt zEmMUWsQm!ik`OBe>h07pW-}FQ)G#k#1Z{>W5(2G{FBAeDBnqCPvVpdcN{UKTLA3;I zzdI~VXh2;HuZL3d6^ipgyY4~bh@hk$;-|@UOB}pk5V<k}Pm>ozf*msMixeQBQ~*h* zps<46fKkoBz_1V$CZGXX24)T>(2i%cSpm>KY|zmtpdI|+eIcNN0F<pjK>^YS;urUT zH$!zWfX<C9mI9rA4%&<gT1^aEN>j-Px+ty&v<sR!oFPwvg`os=Lca%OK~M=3Xdko~ z14t!gVNeZo3UfARQ5N{LNycWT;;a(T>;d$U<~+F?=Aw=gR?uV=_*xv$P%sDR4EAP5 zaC;eaJ}Y~bqX(n_h6OL^H~~<#3Cd^s;A#<ETZ0Z(D#^$%Edd?-20A%4F-HMXbQe`= zfL2Wur<Q<b1(A-L1epLjvIt^`hH8;!l>$hmA9Ohda-6_cmH1VeSV0E(Vdf=+7Hxtr z9Z1ed%u5HIh?kiNsU1>M^`VInB|m~f99)QjCUwC1Q2>-5J0M$rk&7;HL_<rgTcATM zb2S-}=7~U=1DyAFgCZYP%&;+3p)NR%hdKbXOFkJ}DW%B<UgrT?Kngh_4}3ByxSE12 z1p#$NP{t|1t2UVPp(nA!90YR9EnXDsR)Jgv+I0%*K{GLe)>wenU@$QXFbOd-ffiyi zR!O0hswmpweJfCS!BZ&cpjOCntj$cY6pFYN0+B*HLFWS#OrfBiPuUzr36N9>nGnsh z0&R~0=YR^7^s0oEO2L&}Ei*)42Los%6I+^v*1}|@S$R-OgrzaWS}t&!9qdW9C=FC? zF&2RqGlG*aq?iIt&0Ykh3G68q8dii-YEe3<?gO=b2qn^@K#)pMF{uf43n-Bm#V|53 z>;*Xk#A9FvEeS$SnxL6gkQfiM5JvJub|O4WgW4n@OzmD%Ju?FXwCM!tIDr?_p%hB6 z{sOc|nwf`rUM6K-C+H|CsP_c29i_pJ>=K;)C-@<4phb|-3b7b;b`D}e6R7bIE8O9A zC;ZG9(9vrOpsPspAtzr!&48Xq1G<?KaY!aqt{CY!7_=59sGA8s3<p{)!jIfjP*5PM z>ju^b9<Bj}2e{^;THg(9Hs}mN$U0MsJ8%&5QU|O92elt^zG*PL0|yf(rvnGo8&8c6 z9M~*yRO0KvfmNlX#-nuLiZVe39Ar!xquU160V()Er4OX^%VK0;xB@D6Kt&gW0FG`O zR5QG>3Mwi=^&hyg3fVkR!w9aMBp|J`G)72^3v{m!=o(s3>kM?3H+ZoQlV26|>fqF3 zD_9c-Zwm<896%~$TR>|Nz#A1)K%RyU<R!w2R){x2Md>X;c=Zj-h_6BZ1y$Xkr7NHs zAALC))Vr{3UktDFL4gD+RKfn<0BWQ&WHDrcE<XizIvKK<Kpo5)CeYDGpe^~JCGiUx zYgsCsYM8-G1TsK_Qj!dirSKrOEoh#SA%_J#@y}Yr23l}e!<531!qUoQ!vHg>Py;c6 zQNy&5xfZlRg9Eh1zm~IvvxYN;6|}gjXiW-R4M!RiXo(_7E`{BOp@svz+-gla=$2EC zU<OSNzamiN-C_stSxGGp0T1{^Nx|m|^7D#Ib5n~!iv}P^8&|>B$tr+XDB6I6o2$qH z6w<yR0yGl|ov$v=$Vsh$9KHY^<45d%flPYj7nBr(XEDHaB<wH`7LX|*V~fH;tQ-)* z4I+3zL@sE)iZu^BZO@sUn*y25fW$8%8Rs!FFnj_<E2sw!YS?ixbAXrFg09%%U=(5G zVd7&3o%anop@W49*FG79GvW0pXb%J^t$?E(v?3LB5<|ry(5w`6+HebG46<Sss80s& zr_Dp`cc@`aVa#SOvM5xlVOhWgSy5TbQp1+QlFd}K1RPbMZHerlm5893t6Gj4js>8t z>g*}3nGDU$psDE!n;H(NU7$r8oS?fYYe4#IYB+0IQrK$Q0vHNw!Wl|9K(_%mG3N2q zu%&QhGZk$B$<=_4cjByJ%4Ar`RKsG!P^c8nP$&SJ+zw{Y<V*y$hM-->L<RNg<lGc1 zh3fo*605SroZ4D-@a+en-2pi{u*IyppmYG6+(uO7kn7jMbw2cDxttsY(9v{|f#;Nb z@JTw*whDN7E+;h+T(79>>Z*fRMZqg_P?s<<GfyEUu^6-pswfdOY6u#V%~JrMHCUXS zUj!R>1Xa|KiFJjP{M6z+^%8}W#B9Xj2%wXmp~rM9Xr$_;>w!)REiBDUEl~%bNtmjj zUY3{xIu{f=S%5Tdia5CsVnZ=(3ncj9Y{;5p=;CNl9i9n3vJbTVASb61KFp5T2aJ}L zKr3M(YhpoJvIvxs{HkPw!6&YQypfcu0G^#J$yZ2EEl~iCZh~{GCRY)7eRM3S3<RyC zg>0&WW#Rm!EU;Nc?x6hR1R_AWqNot0{4i)i3Up~aV@i=5NY({JaDoVMwgYV>iegL7 zO#vAs4$6Mad8z53^M#7hvfV9V@XS+g3MfUuRtWI0FfbH@SCMeBFo`gUF>x?5F@e@$ zgEnsqfse=mP3N;Qf$p(oVUj@4j983>XGYK}5>UO93_1m&2{aWT0m_I4Tq&TP$XuZQ zD)`U<&}=+NhOs~eD#KI*IZi+=oT0)4wBDq^4lH9;%Ur@-!(77B%v2On!wkx}wXAt; zHOyJ8psC{pY$;3&8H-A4SU`)$z{|Z@YFNN_I6#M7SgRZ&GgEU?z|BEe6@#m-2hAR! zq>VJ$01nn$Y>;^Zzsz6%|NqxyF9KI)plx<VApb-9!>r&@0r1THEsoT@6v*Hq<Oq{n z%mvx$MP=X!10DGRnw*K^1TS9#9Y6=R1VVu7#iCS31_l#QT!H2V89;XlGYNpFWk5F! zgEk=YFjlFc^n-B>3Bg+hpkflf@a_V9;T`Dgjx45P&_q6SkpgIOFlcNAJQ2^B!j!`X z-gVBD#ZkkY#o5eM?1ZeMhAE39i)#V*LWUIPY__5}Ou1SXuo|9P)*7ZP-V~N>=AxPu z)`B|F`XI0jUoAUm%_oQrx)K<?O^dCDeIaWNQ#?l%4~mJ*3piowK=<W=))Yb1ML-T+ zVXwO732yKgr9#$xCV~zk&Ck<?EIm<BO35rP$Vsf!1zmEX1TP~&qwXNAp{tvbnp2<) z&8gtY4p8w0J6#EMoIglAOrs`f(GW-hR0F(x1m!m!xN49J&@5kSF=)3pD6YY~CZPur zfCd7s6;gAGQ=x~#z)eX5-MED)oxlwPKTW18*3yzRU5i^Rr6p+=w^++F^NfvdF>*nL zH3f=3f(jB)L>Gb9O5frI`3bgRs2H+JSqw7B1zMjD@(`?SDEbD{3OeQmG;f@eUs_W1 z10(|4aa*(syaW}p8w7HHC?Ck5@kym=X{n%HH@Db82c;!vKo`2*;(-*(@!-3xAg%(N z4>qk4ln>bRQp-VR6g7cLH*j+SOn@^$JtG5y8z=*S4vJ!6<6wf^7|O@U!y*8_JCp-d zSTTXlY6LYBS<ugF#O_5+(0MF=Ad<<?O;fk%706dy@z8PQ`1o5q@$rSFi8-Jt1<<i+ z@t~FH@$p6AV>PCM0t0l!TG2)j3w)5<Q4kB%@Bp7Rbc+Wx-=3Ka8nDezDFPk113oGP ze11d`FUXsqO`k=QAeJ<U0PPJa0?l?8serhkwcACY1%%)we?_2WS4E&@Jdk!7Xq80~ zXwd<9SrB*<yeJx^4K%$2x~hz!2sEq<?rDIBEQ&xKh@xze5>Okgs1(Ek6)i=e;Dr=7 z;2;MR;BW`coP>amOakqJ=5S(R25oZUU}j<B;N`OB5aHnG;oy+sVCQn;5#iG3;^tuI zVBz5A5a!_LkmZo(5ai(H009=Ts2GPB2PcOxhd75g2RnxphX#ibsBQp_AcHZeu@1h- z1vC$je345k3#csyzHo&#MJR<mg`<TriY<jRg{y@jiamupg$I1C3vUWv3qurV3V(_K z_)-_aU<OU$qP+|Z42hq)p&Otv55otYHkbfCzAr%`EipM0d^`epwiY~F2bzfiEy~WR z1l<V>*@Ou_ECF;YNNE9R@hE7YV*+R+9b_#j=-B4s;?h*e5QR-fNl8JmmA-y@W=TeA z5@=nLenDkHqCR4!seUF{xxT4|T|zv#L;z1fCV|QU(0Ku%No{ahkf@MW3c6<nwhRi| z0CEIP!xpE4&%*^3F~}n;ptcy~7KEf!ctZy?-B6kbnQqhv-O`bo0%;yXg96elgd9+h zavC${_z?VZ2zBrZ!c6cMLg+!+#TofUB{~WjrMZcD;1d?WjU*&>uqj{YA`Kk{q@%__ z8^udOR{&(@DS(R_h1}HQ;>2{&B{QH=8Ay?$04mbpGSKi)0PReN>^23vBr{C`RJMYq z)Db81W<uxDLH7<Ij)@0_4ERKGaCn2N0>p|7co`3wqgQ|&?5n4s;16o_mS+~HV%Pwx zT@WTgo7CVN8xYk1=&bxiSd(1=R0x9Fy`Z^9&<XhvZ-TE=$wX|wS4hkQ5AVR{3E;;A z!!|h;D`b{H=g*-FN8#P~%wh#~@D+~gh~R>+D#06Ga8=-?0^r@mIiT~NL03J176l-h z@(LJNEr4<wHkW{|ltgj}#JiwYzOF7PE->N^WyuqCCqJkYQk0*QlbQk<`9i)D1|?v1 zkd79BUONB|<04pygI4cGz;2g;ESEq;AGj7qiDDGTfQtK4@O_R*cLJas+O2~y3%=4= z9U7>aIjQP8Na+^b%>rG907_d5pw<f{!l79OVG<}IWfr9ph;X!EhH8Q>`Y8rSJM7ju z1yIR`<-Vi5#9YuQEYt;%(hZzLz{AMU`zOGoqsZ4ofHEKGByp%V&^iZLJ^&s4o|=|e zno|Ng3?Jbo@Tv6R%iZ)86nqma6~KmqVj0xcR0plC$}CD%haT$>I^-s?L;-3)(zPO> z1L;#?D|Hb`1JoLW+^>yv&w_$FWT+Y=AixtQNEhTn0|C~30Id)~l+y?=fJb*R%3>^G zp_P|kq6N>!kgfG7=@%AmTA9TNb)ZxTx<?DvT?Q3q-~&@Y7uJ9`D8VkgQb+~w5JI@D z1T;GduC^ejpd&{qq_R*-F3K-1PA)A`0v|O1x)mU)6mlaIc$+xViS?iZIx_P>MkFeL zube1Whp%!2rwT}@7K6K7px}ThDlSce1tG#|pp%F)q2)13Y6s;+<N^dVe_H}dRB&H{ z0wYfWoNy54f#MEyhCXO;05t2G3hvawmxq9EManON9sLd&)&z$ZXdwy6v7k(fFb$<v z1z+3+QUkdm2RuPnng>3J5|Y9*OEMEdV+)|=L#ZjSWA_ylApU}`P%8#s$dgxzDvDUQ z20m84II#@WzyQ^G@YPKSSApDs>@v_y3N(L#90k$^n;Zf0A+1s9#ba3087L`XxsL~Q zni}ZPIM87}IhD{ARiJo)ucoWaFGV;j8N6~1<X#1JSVY@KD<vxFC?zSyg4WV0K+a`> zNh+u(La&2K0?T6LV^FCCNliGiGU(Xn#DapN{DPv)#1hz|I!AbV1W$rOg9daX0_d3M z67Z!=>d@k_7*qm7>`({SxZubFdkPw1@Tftp^&$66sh21ug0H3nkC`Dy3MfH=itzHp zN=Ppblp-Oe8aS7LuAu?dWyPgQ;MH^rh^t~s@)aQMFvyit`Q>@A6=a!J(1s|igaDn% z11$`5^HVa@phw~$4PSuV0rryuXxkL1b^)EI4ZSNTzX<G8=#V<7Ac0+6laikdDg^S< zA%|grk{s-C0a$th4S9iE1xUwaL%ix(oSBjeua}{#`M}ppKyR3YIUm0659$Zx04!F> z$<NOQyDzZ>oGVb9o8V*)Z#zINhIcPO-55~!0z5DbS~HQtSjzy~i(10~T62=Z3_4u_ zJm10MS5<`41V)_YjiXr(x_1b*Ne;g5hxj(XnW^4O(9#)A$SSksZ18ann#@J;Gq;PR zK_h{T*iN!20&SXH4C)z!#@ZN|S(vNDq3+i!Pb|tqI*Z&b1l+|-1|8!H>TrR!dVw^7 zXPrTpWkc33fvys$0bNZ1nIHk(>i|0chanzxd@C#H*jDfr*(NotX^ge3kRxD0hqr=H zJLX7XPGM?cfbc=%<3({b95w7IEH(@!tTk*UY|TtXc{OZljJ0evY&8t=oHgvAdn0Pt ziu-C<i~DNWi~CBrQ&>R@fWXng<_8*21G$y~H0}zDL(n)zF=$N)c-@N-XwNrfJ`1#b z4|&lZ6L=U7d^jd_0Sw~!N^nR(X4ODz3U+`35M%)xLzN0F_+Y1eV_Wk=ysOZc5|ZGm zT?ki!&ylZ6hdK?s#t2-PrKF~T?$v@7Ux?P64!k)7F2)i|6cB|S=$=hjp$jVS5X<V+ zbre!dlJzusz{v`-1C0ZAY|kxDXhSt8waAN+fdLV`MWB7aU?+kOy#V!Bi$G^$gVzCR zLN=X&%_`~vY3l_MU<1I1<M)BMAmvd^sYQ@@L5x3u22@sqf&o14!^{Cbfep0FjE|9x z8Fbnj<Y)wt2pbdVgtaOGXc%E0(he#FKp0#IfY!HzhNJVjK<iV388jKIv>~JUkhNK` zA_=)2i|8ZTYcdsqy#ewN>?l;QtHA_#=mfNR>m<nOpmfE+R3!y-7_<UH+R+Cel?4?8 zpezY?B4{iG<iuhT(31HqCeRW?P{ycX%wkRhEvseeV`OBg0F9l4&Q9h7UHh<r4YbgZ zk)covzH}Zmu;dEfehRM#L1krTNinRa2s$bi(%*+V4K&(-(nf|14S-tuk@=;dE8`UM z%TkMqK*c(^5ta!$coklCmE<cFq!xh=83(n$!8Z&g<|yPBfbQ4=?Mqb1N8GRps!5QG zd6X-dz-B}07qF#Csjw>^!F5bY2Iyk1yktbDvmmty=1EBJsW>0eD*#=Dms^lulA2cn z@AfJvR2hR>YtZT+y72;iqXnefpINK`I=>R+FF#FoNc@A!P)O1S54wSpF*qN92jXBm zFG@k9f<~ZZ4o)3l0-QuZdo<31k_ad@GH|kimb9_(G4U`~385#J%slLg#E1cO+FKR_ zI6*Li5(H?%q(~2(EI?O9Ly`qEG+D?%w=gm#g4~0aEHaU{n}B;S$Pq)=BmnNeKqDSD z5C&;RgPLu*`Ng1CTXHHWnSombpp*&Cv5<HNjk-XO_W`Z^fv0PzqGAQmeH02wpk0}X z#o6GK2jK=m6@!{^xy7kDWvNJqp@L360*|7CV;Wp^f!8!ZPvHQ^G-&A>dN~FfLwyK} zY0$h211BF78zT>6l?W`Bp)D@(j!u+#22G-Y3j<I*SLlF>0~dx^C2&>;uPH9(059TT z$YQQxs$qhiXIIDp&;HLD85of7SBHjxLT+MqYOz8w=r~bOn-J8sPOSisA7YPn<S5B3 zhUG)(U029j6tYT-L5o?_@{3YISMz~SZ~~1@AchN|QzYP#E>M5BL;-y7H)sez0kTsb z(hUU_4)9(%ym1KLP?MNfi5N=(IX*En4|Hl}P9^BT%1n3<Pd^vDp$FXUgSIL`v%dvJ zsl}kvIlwzvQo*~v;qi~+8E`KT(ZhrLTu(s(qbLN88s;e^!VSV&Ai}$Pup$TI-b7IE z8f`EXZct)6$akQ1$t8(Jpy_2~CqkOKpd3(@u3D@B8p{O-B+`sDq(h^iS`3-q2L&s# z3GlgiXgGq$nqUnCP^SwLhQ*Nid<9kT`Cs6)51wBDEwllbfhgr2wp`%J$iVOclnX#w z7`Q>FhA=TQF(K+~*e-ZKO;)!MNOKjOlQg-(b2CM4phC1AM09|NP7ncV02hJU3E=J0 zkbQ5U>{bM_4Xhi902jNUDS<4IGe8>`Im}s@csLmtxnww4Koc6^2?Kb?0o3vYwHZKl zaWP0a^1K9SHNPe^xN%;U=bV!WI$A8hNCDLB29Jj%<(HO#?x!tEO$J9VXt)_%t%5Qf zV(ecJbm^c1<eaq>&?Vo{K~f!s(!89^>{JC8=>5H!`FY`qMWC@3Jy1CWnyo?)5pdmt zAi&-Qbskt)p%*=HFoNBy>3xemK0YxgCq5oB&j+3-TnehFz~{_>yB;S&XUXt_QVRHJ zSiPM5^rBkO6d4~v479l87LuCe+>~2L(jbMm1VALj2=Fj|F?fd}vNDil5vbvFiyxsj zB{iuu9dfL(7(z5HF)z6?K0UQ0zo4WDR6G{7f}F&i3>y6fkG>QafqFQ%SW|NoGjobS z1#S_zng%7hBG3|{C_#jA&^x4xKs9ibAX21&HWd}+K~8i9Z4`-;#*oy5pXLm{GXUvS ze$eR<MW6-xQ9?+%Acq1JgImksyPQf3O7in_iXn&gAX}cBpO>9lSp=HxM{yKn6-yE5 z*u5xT=qbDLpuj6G0`+Ra+qiFW#m7VLIE{}lk_W}89*6)<suh9m0xT*A<r?ssJn%Z` za*%8#h-d~8ppzDg+CeN(m#}C$h&3BTfR@b{Eda5WfQS{KP-g)}e-S8yfTxndc?X=n zkg^;&HG&f2Ee;z<L1G7L5f_8Ph>Zz!&>}hp9jge!;8|WK5oR7n9?*O*qX-j(2FdX- zf=^&(=3wOz<uK#$<zVLE=HTKG;^5(6=V0gH<KW@o;9%tt;^5?A7N}=HKpDPz25A6S Cu$#{S literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03742020f14f6415457f65f73f298672486e36fc GIT binary patch literal 1991 zcmZ?b<>g{vU|`Vf?~FOf#=!6x#DQTJ1_lNP1_p-W8U_Z26owSW9EK<e%^1Z9<}*bx zgJ~8h%?hTOa@ca&qu3c4QkYX%ayW81qc|BEQdm>iS{S0ZQn{kIQ#n(avv{(2n;E0{ z+!<2XQ#e`}QaDoinwg_`-5F9iQ@C0fQn*rio0+5dQy7C8G`U}b+~lXpc#AnVvEU^m z$i<Aec+*o$;!E=i5=)XZQd5#aN<bJS%fZ0F;0$uQ5y<I`wG5RaB@8tTDNN~%Da^f0 zS&WPfDJ;PZEDR+~*<3|Bj0_+c$&kks!H~il%%I6uWx%DNpr8<xT2fk+rw~$9nyQeQ zrr=yzl98XMkeryOkd&&BnOl%wRFaya2Uc1o1(DTr$t*4@Ey>I&)=MhQ%t?t)tth$0 z31@0D-r`6r%FoToEG`Lg(`3HI6(0{VC_cW3m4Sib7N=`Pa%w?IW`3R~V-$BX*h-L+ zoRthkoD2*MzY6pViZaU*OH%dA5{vZH@^eyBi;DG)jP;Gp%*@IyN-WKb^Wsx1jB+hg zEKN;}P0I}o3=Gl>^h5LuG7EGw^NLFnb8>Vo405wGvW;@|i&INV3rh0ybBd9fsTC!u zdBvIed3ptvw|L?+63bHKA#ULTg)1K@q*+)PnV19^Ss3{k*%*ts85kJgkpPlrf~6k? z1_p*y22h%bVoG6*VoqU7VQyiFVo701VQpcEVohNSX3%5@c^qnImANa-dWDjV#1e(l z;?!aVb-iSDg|y6^)MACqJcWXs#N<?k{4@o1y@JXLs6;X|$YKTt22e<X(yu?ru^J2v z3^gnZ7*ZHhm=-eCFvK&KFl8~<Fw`*CFr_iqFwbMEVd(=U35H+>O=iDad<B*9Ihnbc zC8;U#i3OQ%nk=`N3-Sw!ctO#_6%TjYEsps3%)HE!_;^j$TP($?Icc|8@)C1XZ?PBW zmlh?b7T;n?EJ`oF#gttRjyVVc%5X&j3=9m)Ah&@W$-vCVSS18ERu5)sGAJp7JOok% z@)0;m`!O&ulrS_i6mfy_Mh!z2V}Vc#Q!Qf+;{v9I3@OanOhqawEO|^RthG!f%nMjb zShLtt*lL&-GS@Pfu$OSuFxN0-aW*qGGuAM~bArs!WUsmdPQ#ES4+&YQ7Zl1fOEMHd zL975z62%H7`3flVB^jv-C5c7psU>i8auV~>OB2&m5!&<=LNYRo6>?LPGZOPMi*pqc zb8_;_ixuE16H7}n@{1s*mlhP{RKg7_C`#2$&d)1L1?4xm)k&o#AeR&rrKY78DS+Gn zb|=(jkZcL^lHV<cD&}Nu?J5?%<br}KCcWe;R**^+O)hY%y~P1@!Y$UE{PNVITbya7 zdCA~Baf`hmv8W_7G3ORjQR*$`;?ksBETFtw1WMgS!l06frAQEzFjzo_L~%ia0hH^D zWEdDASr!rTw`Ag>{)jKAtcZs?HNGT29;90nlp;X+i-C=eiG`7iQG`)|u}TdoW#G~5 zr^yCNke~z@9}g;4a`RJ4b5i5uZ}G&(7nUaGKxNqD<5TjJ<Kw|;ut*-&jhrAZIE8|o z0m`_=Yzzzx9E>bX9Bf4(F_bJ0N}%8>0+gOnvp6U#-D3C2Oe#t&s;sj0DlINi$jQu3 zRY+7QN=+}#Ni0%;`%6aw6qTSdvP2=VSRqj%2ck^@R9K}Zrub>H6oK4QqzH1J5{Lk0 z9!Ri)oeU<x?p9%7V6Xs%BPfD67>huBO@Sh5kS0k`Jn^N#3+UwhqSRZQaQ-a;I8!gR zs3^av_?9q|2&_nol13DndZ0{El&4pmS)rGkUzS=7P8U&Zx%qk7sg*^bj0;X;QC#2> zw4kymwc-{F$X;+@7V(3e1#%)bzue-mfyAL5D4dJMz!Aa02!>2NOgzjS{47j7%mNYs DBKZwR literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e646e63771703d0dc2aee95684d4f3c8dab1cc88 GIT binary patch literal 1556 zcmZ?b<>g{vU|`Vf?~L){VPJR+;=nKy0|SEt0|P^`2Ll5`3PTEG4nr<u6eA;u&6L9w z#gxL3!j!`t#SErdqF7RxQ&?IUqF7T{Q`lM<qS#W{Q#e`}qS#Y7Q@C0fqBv5Rf*CZq zUxLinWW2?nm{gpfQ(BT5pP5^bUsU3k43Yq0W(EcZ4h9AWXOQIq3=9k<3=0@j7#A|u zGE{QaFk~^+GKMqciLfw~FlTcWX)rQ?U<zX}Lj*$!Ll#R7V?1jOV>3f7QwduQQwe)B zQ?XAC(*lkZriF~POf?`!FjrXyrIwTy<rOQW=VT@&E0m=c6=&w>DHN9!W#*;pDC8F@ z_~qxNDrBZ9<mHzrlon^^r9+hJ`Q2hoEKbhM)a1OymRwR<kXn3;#o5Kj=axu%UTJ)K zYDqlE#CWKQxA+`ON{TX*N=s5*i;D7#ZgC{XCubxU#TVRSFG?*2>A%I5S)7?yT#}fV zoO+A7xTNS7TS{tjeoCq)^DV)GqWt94;^O$c#N5>4g2d$1A~psFhFjcF<Kv4<idHfd z@iQ<m{L0ZUD9S8LEJ@WbODxh)%g;$kEh^SGGS)XXGczl<D6upz&Wlg6Fv_(|u{1R? zHZ3<WFfd3j&=1is$SlwWyC5e=*TNt-J0sgDN543=q_m(UKR>4!nF$Uqy@JYHB48HG zn;>^&=B0xYQ?Upr4%xXFnHaek`Iy<5IT+cPxEQ&ZiUb)L7?MGe3sS(sz`y{);7A6g zFi0fVFf3%MWv*c^Rw-dxz?{NV!yv{`!m^Nwks*aSn4yHVhIs*73d=&qX2u%EY^HoS zs0b@qgejXfm_d`xuS!M3KENh7F)P2wF4{oXGFDqNMh`5MnTHUnvURN}NKGzDO@YKL zJQ0*<mSiXxDJ19T7Ubup=9LsHfQ{121?kpNNY5{^Qcx{+yTu9?zQqa_*JQuNRFn!5 zD@o3{#ZjJEl$V*8UVMuM#Ja^7RGL?knVT985x&KonOAa)HN7amv_O-khz}H{d_}2+ zrI|&kDe(|vd2=)KGIL9F<H5$?V$21{GK3HSX%J4%NKMX;M~Md&P?iB1$H30R$im3R z$i>LQD8yJK2MT&nh6V*aC<@>~50WWiXl4NAj1-1!jv^sYPAXxnVX9%MVQgj&X3%8v zbJK*x9@rdB<|1hZ28JRT5CO6a;wDfUECM@BG$XMrH69dvi6xmyIjImQnt+@J%GL~w zY>XU?ER03+AV+~51j39A3=AL#g3|-sQ4BQ<DU4u8F$FWEFxN1ofoR5H22GZ#$st9R z3MKgpDXAr?MY)-IsR|_-si;xO#igL2pa9G2i3%m91v#k-`DxI6UaX*zlbNIgi+D|i z@{G*n426``w8YY!5|G)cxdkPaFx6ngGV>IY6N@2s<>cpQmli0bC1&On>w#tcG?{KO z6e)nBhZP(#nvCFNugQ3e7tDuc81yjXfE5}(@L*yC2NP3~GN^#&yu}qCpH^B@T9g_e zUjz!MB2W|-fihc>7$_z{xeFXW;BW=&Lb3!AI~+E-`6;D2sdk`bPz;Jc9wrV(4n_`U K4k-=+4haCX1C&qz literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b30d476dd17d5e55b97f4d4d9fc3025674ed10f7 GIT binary patch literal 3766 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 E08O)cm;e9( literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7da8bdfcaa3a8e9108ad108c2c8bbc0efedf8a0e GIT binary patch literal 870 zcmZ?b<>g{vU|`Vf?~D;<W?*;>;=nKy0|SEt0|P^`9s>hI3PTh_3S$aW4r3G}m}ZJ% zN?}f6X<>+BPGw19&1NdnN@Z?lU}Q*P3TDt`tBU6GNi5Av&QK`HNL2`^EXl~vQz%X@ z$}A{R$j<`{Cg<noCg!Cm<YeZhDkP?rq!w`%r<Rl!l;r2<6f0yFD<tLTmlT&2B^DH< zrYMwUCMsm+7UUO|=yAOSIngf}M1n9I0|Nsq0|SFI$gxEX3=Aa<j0`1=SxhO6k_@#B zCCoJpDPYI;GS@Of#8a4CnIs`<m_ckCh7y(%))dwfwr1v9rW&RihGxbE><bxcnQNFA zaHO!MurFk)WhvpTVX0wA;b>;AWi8>VVXa|oW@2PWVGd@{<g5zdQczG(2r7km4(ip+ zJcZ)QV!gzo^s;EfScSx5h0HXC%o2r+#1yddq}0?rh0MIN{Or^eg}lU)(xSwioJu{g z+)G9V28LT4@$tEdnR)T?ewxf6PFiM8YJ5D1m6w<cVzI}^r{pKc$KPVfFG$U+Vu>k= z$*W?D$-BjpT9KNp$$g6_K0c{5Gp8gouQ)#b7ISfB@hujRgKn{;WG0u~Voy&kNh~QT zy2VkFpPibQS(RGE4zie~C^a$V7JE@@K~7?F>Mi!<{M>@foYW!?P<mmz#SQUcJjfNd zI6-7_0Z1Jy$QALo*dWqT+<Ey$x$zLrEtcf`l+=|BMdAz$48L;q3yLz!5=&C`%My$9 z)ADmtQj3c9jg0k;&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf| z5_58NEevwAGqR0x^btu1nVADlgL(y(x0s7c^LRlCL;{p#SXmgk7@5G3gGqvkhY<pc zBpDbOikLw@WGw<Et0F#-04R?@q(I3G?0h5wWZ*3ho80`A(wtN~7LXkv4J@o2j2z4y Hq8y9>x^(Tj literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d8975883b7ad3974d20c6829045447dfb1b309f GIT binary patch literal 2449 zcmZ?b<>g{vU|`Vf?~J+2&cN^(#DQTJ1_lNP1_p-W2nGg*6ox2<6vh;$9L8LxC}u_w zn>mLimo<tN%x1}9%Vm#Z&*g~X0P|UMIHNe-8B*9%*jpG<*i+e?nWMPe8B#b>I9nJ} zI8&LMnWLCeSc4ffxvDC;oJ)&K@^dq*Qd1OsGb=Llj7sv26^cs>3i69ethl%obQKa) zQi@?B3TgR83d#9-WvN9anR)37Df!7Isl_G5TwGis8JWcjx%nxjIjIUoiJ8Tz#R`de z3ZA(jgItS>@{1Jm^ArLqOEU8F6pZw^UV^-;$#{zsZmTBaE#{p3bWNsP{6VQ{iOD7T zMVWc&A^G_^x5U#^OXAZqD^iP!<I{@rbK?sVld}`kQ~i=brob>0EYMUK7#LC+q8L*c zqL@Gd*TN9RoWh*K(!vnMlERw8*1{0Qn!+B;pviGd!X>k~q_iY6rx?x7WRPhflR;6z z%)r3l4~h;E1_p)_hAhS!#x%wnrg=<#42%pZ48aVVjDDI-MIdFjSW`is)nvKFQk<HT zc8fW;IQ<q&Vo`eWEvD@9l?+8Z3=9mv3iS($GRqQ6QuWIci}cg-b5c@^iuH|*^^MKU z%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ic1o6a&#>Wa<enCjdJvh zQ%gz<O7in_ijkQ)nMt77j8Co5E2zB1nUkL$4|ban$R}X$F;*$z^1mKjIXoml-UDHG zkbWXUf+aIAEnkzlh=YNFp@<VifD$}703ZY}0|Ub?ZjeQ}sl~;K>8YY1lc6qC!Rs=p z2D078nv$ASnoiJh;6MW_l|XVD{y+mO_tRv%#StH$mzbLxAAgH0K0X(mGvecK@x;d$ zmL}#vWQzDe!6E=6K(PV|7ElU-us{J+#KyqDAPBM@#Nc4$VCG;3i=m`_P`rQ(3^nAm z&zZuM!ra0b#hk*D!U|6P;6fpaHH8C|{fj_B?UoGE3rp!BJDfq56)`X{)G%Z*WHF{N zW^)z^fKqu4W3dE?E@4{03^I8EOAX^fMsbFPjEoF53=3EnGJt6|FwInyRKlLcQIuE0 zS;LUU)y!DST*I8jUBj3Hf-Jqvj0|}^B|HmwYZz)67cxQf5vyNF6}ua#AWB#G#i*dk zbc?mTD6=FriWgSY#OLSbRBH0w;z`LYE-A`PDlN&(&x_(HEl!OGrFL*8EaC^HES9YN z%)DE&@$eERK0c{5GbaU7l7Qo;_?8s1bZSL%PH9RiL_zT_E=0bH5-BRp16vTEpBE2v z3pgHbaf3@HsCgVk(6Z|m7sBLQ95CIQEa2>Li#07XC$%_=17^}K#v(|RgCidt?+OeI z46>l803|&JW*$ZsFce|rVB}zAVPs?EViaPk5`z0q4`xR)BPcc*7#Kj&%gVsO0FKZk zXoMDVfub;-p@t!zp+c^NF^kECAy%Z85fs@Am`hk{7@HYE5n3n_4oU#5S!^i`*_=gj z6$&*BS*%%XI8?iZ!wW+8B9OC-WEdD2qQqc@5G0JC<#zEcw$zG})V!1;kn@T_9*p9L z#UM2FHJKnG#aMtAFj2x-;!zJ2P@sIoz{my;93DmyMjl2!#wuAv0AbMw4=Ye602TG% zu<`>J^EC`9jOh%`%;2zL%whtEgIW#a0_GZqEXFJ*P$*R>)iAm+#7fmN)iBjCWU*wk z73qNJ1*|n-`9d9NxG?!e@u4O!O}1O?>8T}&B_&0W5D<rl0II?wWl;G53e#I`MX9;@ zWvS3|D~cbg5SpZmqqrc!3@TjELrow)9;zA|z!sn&10^>GMjmibaWQf+R!JcT7pew7 zO-46OwjyDWYe2<+5vaH>0wvQTDUg^nhyWRgW;M8&0i}jwQ0c<K$R)_Z1s2ofzQrC7 z%1rU`xA;KW8C((Tfk?1?kvu3HbHZi7dHa?CG)d{fa#|56-XJLnWD7V`A~^x<B2bRH a#bE;}h3!B!QZY!Jg$d+!0VWP+0d4@AqFGD; literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2898016ec031959d75825eee2e394ea73c25eca7 GIT binary patch literal 4650 zcmZ?b<>g{vU|`Vf?~Ius!octt#DQTZ1_lNP1_p-WISdR8DGX5zDU2yhIgC+^V45k4 z8BDW8v4CmTC{{4d7R8prn8KXHp34!%!3fdA8O52xn8K37mCGH)4He^w;z?(S;!R;q zVQXQC;!9yq;b>uq;!ojB;c8)s5=h}r;b~!r5=`Mu;cH=t5=!Au5olqE5>63J5o%$G z5=jwG5ouwF5=~(WX3!L^lIQZx&&y7&R47O+NzTa3OIOHGQ%K1yE-5X^%qiC6dI|EB zpC;oi-pt&B{GyWh-29Z%oK#K5Tg=6o70HYsX$A%c5Y5cMz~Bt>wh{vaLkYtI#)S+i zjM+>@5;Y8Ij5Q2dOyUf|3?<A9SZWv+G6pkfG9~6RGB9u{C@3fdrIwTy<rOQGWTYx2 zB^IX^D<tP67K7-t{33<qoMMII{GyW76osTpuo~YWe?2a+&hY%A>|%w)qWsdl6ote* zh0NmO(o}`~JO!`Hl8pR3h4PHlqEv;<yyAk?<PyE~)RNqye1-DNoE(L`{1SyCu)PY2 zIXPg%Kvu(T&P-FtEzK#(EXYZPixp=i7Nvq+P@I^Xs*snMo2sYanO9trnwX-aP?C{Z z3^pgNG%vX%6J$HcBA6u#C8c1q^7Bd(GxI<}4e~D7qY9ZN#i==IItqz-DPZH1^Ycnl z^GYDb<)?vyKrcQX<i6tgcs+&S)KrCxl9GaAD}DX+%#w`KB)#PPT>XN|f<*n|)RNMI zlKlLfVtsI66zdxr7@6pS9d?Ti5-ggmw>S!N5=+wZi*j#?7J!2)J~Ou<Cp9-UuOt!V z_FJ5A`);vA!|xUwBmhCNpPW;?lA(y3fq~&yu6{vLW?5oMs(x8wk$zf!PD*M~vA&V9 zzOk8^S-C}trFn5)e2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fo^7AaY<rMj;@74Zgxht zQ4X>Pko=MhPNsSVmA5$J(^E_0bBppNK#7eFlma<<7<m|rco`TN;3*Q63E?Ty0GuLg z7)ltkn3|c21WK6m#7Y=y7)n^OSeu!O6iV3gK$(xJg`t+QhOvgB8I(Sm{osayk~atk zgKT60=jvbvO-4Vk|1}wJv1FE{=7Kp8f`@^D;TDHYPGW9SN}`<>NEgVNRq`O0m*#=< zT55`(O-_DtVotH09!#Ys`z@}_VsMD$C8rjF+<%K3oI>JDDhpDJZwaFq5D%8R#R`$* zaf2qikjjG8TVkjxVM$VxsfZ8cIJTVp{Or;Kh;u=)SOj)6FN!WTki$7ZE@u*86kz0F zDiTKyVo*SUoCwbJR-jN}Okrwa00nF_qYFbbV=ZF|V+~_7V=Yq+Qx?+#<`m|IjKyXt zEHw;b47JQ9EH%u{j7^L+ppuBSYHC1Heo1O_i9%v}A}9nDic)pK0R_t`@KQ-3Gfkl= zH77qYB{c<73OMEz=PRV<6_*yJf(ntu5{0~ch5V9?)FMP#rjS}ulA2cx%9fC{1U5Vs zlHcHFgR@CmW>IkoB*(y$04P0yJX{P46FCM3h8l)gF;HsBVpzbK!myCBn5l*_jDeA% zkSPU}dYEo;6~l9)pC;2Su6StK86SU(tGFbwsHC_&vm`^4=@yfoK@q4nL5qxEoHpsH zd8rizMRsN&OF_1?FfuV#si8y?BoQE`C77mLoN!-NX~3BZ8HvRTi8)27i7Ax|NvWxM zkdhx#wyG9svVybGEtb60ijpEp1_p*ADNuUhb1W`SEdmt`u0=)pMVc&N7f11d0<|bF zF$YpM-C_Y1QMZ_Li__6OQzXQ|z@QKE1}OP4u(L7pFmo{SFmf<*FoNZhLCFk+LEeO? zsvF>po5fhdl*Js+2+FQ0jM<E}3^fczN+k?gY$Z%t?D1@1ai(mBg18iB5SxX8nIW4Y z-ywx1n<0;diGdL$!-^ym1u_L91B$|;q7*hz8ZBYU;>hBR=PKcDW?*EfP%2@{;sM!Q z!j#3E#_Yln%U8=>!jQ$2#aF`|&sW$L&QQXT#h)brQWGx#XY<Dkq_CH;WC>=o6`g~M zvSbOSuuC$;3zP_f%uZnlX3*sD(`0@L^6E=gP&k9CO-<&PpoI34oq>VjC8#{pWGVuQ zzXXMfCNr2_qz;k<m3vUhB4q{!hAMejg-}`m${KnFl?9o4`9<maIjQN1$(8z5((p6@ zsw{F7^HTJZN;7j(;!`V1G=+;mrRgnp=loodOpz=o(pi%8i&Aef7grYF;weil0_C0f z%)GSxTkL6>c`1oGIkz~{GILUMGK))Yu_fo{rDdky;ti+_@C<T>nsZCY#nsI*)F&i9 z$Th$}*fYdGDDsv}JUHvcgWOY;nN$i&Rq?s0C5b7CC5g9KK*G0}lXFvU@wj9bm%voq z;sm8Na0b4`=?crsx7Z;KlHyy+5JS`Qi{f*O%aY?kHGXDdPG(hVN_=vDZb4>FYLO;O z6n{oyaXh$Uj5jp0urQ6{&r3~BDUL5sEK1GDFD*`u;)FAAu|W(+OUt)7Ayy^k<T!#- zv<fKMGI23+F|jalF>^6VF-bAAFtRXmF|jd=G4e5kDkm-`0p=oWQ0WO$48ovz2E{wL z^weWuV5rbYVRT`LRj6es0asKt49!fnj3uBH&6LGj!%)N6%*@D8$QI53Zo4s8xdedP zYzpN?nI)<51=;EGpvV9>AwansAp&YcWn`v<N<&yED-@R`=A|SSr4(y2-{M0x;TA87 z_9zihaRbvB4^0Ptnrye&(^E?lOG=8sNvFsdlw#P6p+eyFBZ3@%zR(EPWV*!y(sheH zFSR_rEHMWybc>7_7#K1@;R;IP3`|_0svRVj49Y5?kOSof5C(@FsB$e~s9~&OYG$fs zE&*5G3z$+EYnT@@F*1}egJfzLKp_VWwRzwo9ujn*S}`8fic`qUQz%I+0{b*SMFCVW zD-@*`<Rm78TSSmr#uMBEPRuJ&&{fDU%1qD9OUzNoEiEolNJ>>GN-fUMDT5TFU=vI7 z6%xzxGgH9UffEd<B1_DJ7rtPz)D#7fBS2XIQsLa<gtrg;G+B!5K%vS~mRM8_u1``@ z(-KQ_N{Z}3eGisf+(>SW;zD@f7AMG1u+MIBz?_N}&bPS04u}V-%!dazI~R)pbCD+~ zp@JGbpx_44pr8i_H>jQhRq!c{&7f+V$*%|`tjP#=s3zkr&g8_rl+2XGl2kP7ibNS0 z7#cwKfD%3fBbW~_^g-r>8X6$FcptdXPho6k>|`imT)?!DA%!WMxkw^~IhdiHA&oJG zC55$xqZZniNMTzD&L*IKMGE^urdp;-nG)6-#uScb#y$o{1~8iw!VYK16JcQ}Vaw(! z%3)*x!AOQYrU-^gffCjlrW7s=Rg*w!7#UDhabu|3fvgJTN==@s7;wBJk{Kw5i$Tc@ zRJ?&ZR|+Nh3Z=!V(5#q~pO>oOo0(jcU!0#-q7ar@T$-4p;H<3;HV0OK6+;q96+fbF zp$97MZn1}F=B4D97yBiHgO`DU0hD_{xkMNg=04!oSq(!rTM<tRQyx<aGpN3+VO+qF z!m^N29Ml?P>|m&2Zf2@wDPaONfNNPxm}^*T7@L`jol00ht+*z}8Wxa98gnp%CTmp) z*kPdFTR>520jytCkXV$Mn_7}uRIC6hb`VJn<XbRLAu}%}GdU5|n*$|1P`E%m1v2Uu zE66vNQEXr;K8hVg8=A!5VvN^hy~UOTstyXkX{`w4&s*#niN)Z;gd37MA&nEZTO7Ih zDd6N^<j%mr5CzUB@dZVxX_*yKoS;ktmb}FRV%}oT%})U};z4#nQZ2YG%ma3AJlIFY z6F{K|Zo04tF!C{SF>-)$l_f+G-dYFIHiIaJm{=taPYK{Cw1mYmvIMv)gGog3fvVm3 zvSd(kkeHJb#a~#OT2zT7zzyyil_kfg=9NY9r>Ew{=VT_u=NEtixmc4O9A-tJO6L|^ zab<ByYA&Rp0QVMeu@@v3m1HL7fOCIQ0H}mvE(!&;OhBmz5+#Nv-~iHOED8ZhfWoQB zl7WGt1r$7>?g9fF2NMqy3lk474>J!F6B7?3D7e^|n3#}hupUjZTkP@iDf!9q@kQF8 zVonGVAfTEI)T{uvL%=RB0;S`kaF9Aq$WTO1W)j3hpn@Yx5GhB18VW^u;O-N+ZUWhp zn3EG94{qCnJ2BukC%8fe*EbM9gNi7y)4-lYB0&DU#bE<!4cLJTDNv=)!USr*LNE^_ Y$m1MLEbJV79Go0N9O@kG9D*Dy040X$1^@s6 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f61a654e36fa6edb5f7a297090117ba171d758d GIT binary patch literal 34447 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 No`H?8o}r#02>{6_TOI%a literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e5d62064d9d2408260e549a67247dc2e8c46e17 GIT binary patch literal 3628 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 I2QyzZ07RCqO#lD@ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b34ecd28da994267e596781cb076b66df47c2bf3 GIT binary patch literal 32721 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 KIoNraIamNlbVMTn literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93946d67357af9c0edfdc3035efcc6d7e6384840 GIT binary patch literal 7218 zcmZ?b<>g{vU|`Vf?~KXSVqka-;=nK~0|SEt0|P_x3kC*;6ox2<6vh;$9L8LxC?-Y_ zn>mL$iY0|Hg(Zh2mo<tND#jMYmcp3AoWmZ)4yHMxIKVV#6epPGisDLPOkvI8&gF^X zVPr^QOJUF9&E<>Y1G71D_;UrK1Q;1o*%t_=a4uww5=!Ap;cj7w5>DYs;ca1v5=r4p z;csDx5={|E5o}?I5=#+E5pH3K5>HV{5ls<mVT_VU5l@k5VTh7UkxY?lVTh7Skxr3m zVTh7Wkxh|nVTh7Rkxx-*VTh7VQB6@wQEp+3l1mkDW{8qcVGd@{RI4&_Pt8j$N-RlL zNX$!7D9<m-Rw&Ob$xsMz4Nx#KGF5QS&n-wS$xO=3$t<Z<2uVyY)_VyGGfl=@{E11$ z`8lN}sqvY)1^GoKewvK8m~-;eH5qSl`xm987Nw@RWG0uqWCVpd<1Oam%nD7$Tde6h znMui2q8fVIn(-PjDF{+eTQeD?7GyjV0|NsnvYbIt;=;hdP{~!ouz<0KVIgBM0}De5 zQ#MzT9V0_6BO^nVSPAn2mK4SXtTl`a8B5p}f+CC|m?4Fsma&d8f+3P2k12v7g&~+h zlgY1&sk&B^{T63&WpQ$TURq}QExz>Bl6VL^zAUlm7Q3gvYf({t(JhYh#G<^+y!7H* zEFjh`wzT}B+{BVwd_kpoC7HRY;Sgy}rd!M)eT=Cq8HxlM7#MyP>K7DcmL-;?>X#)J z>8IuAq@)%V>l+#C8=IM#m0OfpniuEAr&t)}TBcZ<ni!jw8yFZEq!;Li=oe%b=w{{> zmn7!o=vo-$W@ls@<>(iumXsEh<mcxUBQpz93rvhmOF;2aP+7#uz`!5|3Mx>TF)%VQ zaxn@p3NeDklR@DL!l1BaW?*0dhp80<149Wz31bRlGgFa33R5jZo>~cG7SjUe6y}AD zMM^0wwG4S8AdwW-Y^EZk6t-H1JeCypT80`>NODxE2c?#j7Ud}<CM6Z6mSrZEq^2lj z<`(3n=BDPAB$j06=PBeR=BDc15-g}JsEjX5Eh^5;&x_B@OUu8-R8Vk>B`dKk@fK57 z<t^sqoXlHHnFY6)k_$9hZn0-17AKaJ6y0Jjt}MRAQIL~Z0t)$CT*W1cMJ2_c)TzmM zi>;s%WE(idA%qYE1H&y|P;7#n1WJ=Ra-bj)0QsGXi;<0yhmnnui;<0qg|SGUfq?-f zU_kjF956cIfJtF&W(0Y)NUVghnIVNKo2f`6g?Rx}33CZc32QS$Gt)w_d@zG1OO+fn zC_oNE@;=nddbb3S{GXSfl3!9J0&**ZCL1_{z>c}al9ivCcZ)eUvEUYSaY@lFQIJnS zCZYtLCgUv*m>|U4pd?oW_B#)<4sDRvIlx}$VB`a(1$AUEgCx+>LNh}OV>VNf5;)G8 zBpFH=vzW73z$9xLb1;a{lmZcFN@12{NMj0SNMQ+P&}6L&ga$xyWw9RA*WifO&B@G8 zRVXPf$VpX5%P&$WElyR)%u`57O)dh5Q)XVeLP<udLT+YWei4^~f`S56w;nizia;s0 z2oy7Znrz@uDv|~T91m0#*p4D$kPvHbVpe|9Emp8eNC5*6og!5R1_onzpfGbW@iB5S zfkolz02C-JunYo9HYtn?7(nq~!qm*LkO@?PR9S<a3Gr_+*zqBW>0r;5WMmdA6c?l> zXQpK)qh$p>u&yeW>e}jBP39tA1_lO*e?XCf&AGP_ky(<MZU=HVs7PdBDFQ`oNHWNo zAm@St2gC*^T|IEptzl?ptYxWTNny<9C{n9oE>b9AT)>pVRKox&8EY7u8G;#VSZbKE zK^|hRN)IhgRY+7wOU%hhN=(jH$W1ND$WH<LC?&NdwJ0|eR0t{r`#U;$Dx~EkrWY$@ zrhz@4mztWAnxX(HJHZ|-ODs~zELJGZD^4v@0L6D+Vp(ElPGV9{s-9n!oin(^RVYg= z$^;21sH+yM!`1631XPw}<mV}X>?ui1SIAAQR7e7)m*o7SqSWLPO=d`L0VUg8tSPBU zrRkciMf{-H=YYBX7DsADL27bIYDy6gNP@X6F$XDl!P$fZlubY$aRr4cA1D-=IT$$@ zSs2;Cu*d*8qksaKje&syWNYy&Z~#Nf22i@_WT;^%Ue*CBAJ~ePl`xesr!Y4&6)j6) zsbx%IsbxxGsbwx<Nnr)m`z;I|3@IGhOevhb%tc-)T(yiPEGgXW3~7uhJSprg97wVm zDZI5zB`l!2KZU)8Aw>Wpm)}srn#GnP*vnEh0mLerkRnveoFd%8P{Q8KP{UZmRKuLc zD#lRDlIKvvP;{b(VF5>q$U?@V6Db@u3=23@L>Drqh)FVtgH*`XFcdwiVOYQgYCkMw zTELYenj*1~sg@;=B}EdHe1aJ?rK%zz2^}2Wuy{#IEKW^P$j^f&360D&1$ZoLf?_>2 zw=@UTpa3TsaJtZNhQ_TCD3${%HT7<>f@SSMi5imEB|-7Um77>mnwOcJpORXn2om53 zsEl`UbqaMy$)upj2nNL-sJesIVxa8lcS|5WwWK7!Br&HbH7z;6G_ORHsYnWx-9RM= zQc{2y47WIJauRcsQWEW=K_-HdLzOHji6kav#+M|f>)GVwCnx3<+v&m76@i?p$p}ed zj48Kx!#zVh;sYXm9esTKolzVL@*b#sDh8Fr9pC~M>`br`2-j#b-eLij>JSl7DlIZ) zU|@)cIp`K+?k)a+%J@(}PiKD@*Z5%1C|3-7kOCx&5mc0eZOZ)rUw}cA30!a%8G!-< z>~jPGw+&=qG06KbK?RB?QxT{*fqJsEic7T^2CF!d3&2@b_ZOosxOl$BsCSDo-cOSo zl0!k2D^j3?@>3Bg58Yx8h%_n!7kRRv$Ym`q$jL0Z#a@(Jkdv64s>ynbwKzX9DYM87 z<W5TvVFOaf3=#vmSd+2H0wfA@^DS<qND2gn6iAAJnS+syQH+rV3PF`Vh|R^w0~TRp zWMbq1H3Aq}7{wU*7)3xds6hZK3_u|O3IH$$MIE?Qg`_dmApKtt4bofexrr6UnN_Kf zr~^3?!U8){Fg~+5zNj=0RD#AE8zp6yfC9J}WHbX~kvn=h11f94R`!9*8HkldaiHRR zAwvvvEkiA1EmIA{0_GG@>w~$5DTO(ksmQE^rJ13~3{>9a3Dq!xn`<6mF^?3sTBa2C z1*|p9DIAgvHOwiTk_<IW3qh4RTNe8Qj)kC7fhmP+A=3iR6mAd=%K0fg*-S-UU=zAh zctIk;44QmZ2GFt~zqCjJ)+hrv@f6g{GxLm%)O8fpb29TvE8;6G%;L>V)Niq+Bo>ut z<`sdeuUl*o(OWE;#ujF`SPKf0%}j1F7ZfB{@#iKc=NDJRSJy%iqS`OA2gSB6C=Ku+ z8-0rl!pk(XFw^9Mq-`0HD)!vOWKesl$PuIw6u{uR_7-PKW^qYrNoG#*Efx?3sa|2e zC~^YzP*_0;F();#I2CLyC}xv0GV@Yzae|X6$k<zKMXAN5IVF%N21hn1o{NGQ7#PYy zNl*fmbeOnUKy3>?Mm9!1MiwS9W+_HKW)>!}DtHnDHElqxc5r;Vf#Vz80AnxWOJNFT zs1!<JPGQJltYs)+s$s}tZiaMwSV~yaKwTdTMg|asbZtu57O<zVq_BcpC~SU^GSv?h z0KN<i3~u1yd<jZ(FF^@RlLPFKTU_zEiFuXaaJ<Eml%Jn-OB60(7@rL7_T{AB;`Rjh z?jW5aKF5-hqRgbyl2kCih#eH_q8W*0sYqJl!CgE}#-d1&Bf!A~CO~0zOCqxvVKcHt z6F~t8YIQL%aWS$mL-MH*6B~08s2ofNmHD911^EGlLHyz}1_p+7hFa!!hIYm@CQz5X zg`<<9gdv3)6d);V=`78Ros1m}HQ?&8nYqZKhIs*F4bwtKMurN#4n`M-ShZS~8m11$ z8Wu^0Y_=jhs9Kh0<{~?=S{9JnLc4GV5HE!t#H#^yojIzyp&24kAt$rAL?J&-p}4dF z)DcciQAjLG&PXj*(8$b7&M8d+wR6*p@=FV#;+ml56}V;uwSLnx%Tn_czztX(NK+Wx z7tc)uCqJ;3%#zgPlG377kR^!<xrxdC!5|WpJRwa>c<_MAZcy-mYn?g<28J3YP+d?Y z0t$jOrWB@Z#$b>bsN~Rqi!p)4ShAUlY@lMS*{onOwrr-N0H_!fM681`o2{s-LZO4P zhDnmag&|g?mKhps%+1V2Nh$2X424PI3@IGJ44RyNMLwY1#q<(Xjuu6LQiL~%@B)h# zC4ku0Ai|S@fg!{VoV7GriZnq&TA<X$0t(Aptmz<1lj#;;JT#Px<3S>~*uVi>4Auwk z2Ni+x*a}c$0@eErVjPS-jHs9oEK;Qjsz4w`6xgWLVnkh!Y6+;1pOy$}N`PDq_0TQW z%)FA+98IPokjsleGMY@cSkn?q%uHZ{AfG}7jg2&!5h}rE+~O?F%LMgh5<#YbV(u1O zVnIP_UWz6wA^?g)K%u|}@@#5xQ4%OzK)Fei3GC6L6p#QoX9;5XXAvkAKm{WM3kwsU z3KJs)axn8Saxrl+N-**<aWNI;fJ%vEP@)0lFL4G226(~5!3@q{tTmvf3rA5zIzuf( z2}3hOEn5v};ESo1Ns^(Ky~3n~v4#!QH%wtlVQOY}VTe_z1vNRDQkWNjJIpogH5_S- z;^1yGC<hgqfbvs8LJ3<lLoIVULoH_wOF<r}84IdzikfOz(iv+wQ&>`1TA6GZN;sMs zYPnKaQW$eMYq={dYPc70Ed(Vzom!q6o)i{Ih6UUytP2^7X4P;lfQj&e8r=(-KouX@ z##!MEHJl6hO883zYPgyin;Ai(HJl5WKm%`#3^j}sn2IZEm<qm>2sSg+^49P!09A;L z6BvuSN`w{&*YGZ6tmUiWo4{DqRKvGGWFbQgOD%sbdo4$;KnnK)(Hj05_JvHfg6Ryk zLKPt;VkL|v;x!!2j42%A3?SQF7-CIog)4MQBud0<*qa$^glh!AAtg~OQX{m0sYb9y zxJD$6NsIyHt_h5Vap4RT7z;hZ8S>a_c+(kch4Qq(S(#%3W6`=2$z}!+UBkOT3N%!> zkg0|@ovBs`rnbVWhSP;1)~J@HLaRo|g&|g{mbZp=0aFTJ4RZ|xD8xWE)v(m?rZGe9 zI|8<ES2#mOR1HH4M+ze-Ze18+y=p~kL{s>)*(NX*@dYqcnALE(FvRNBvQ(&nO_oD4 zSrpAwrb4-Jh6zlCB4D%sg)^YJMgZa#kbA@!QaItRVJZv?XTWrC3TKKS#J#9;ApIbl z5%Lv&CDNdNunR-1Qw&qBSgj~nhd_;J8Y9RixH)1eEZIyGn2Pqn<UwX3tC+x4xDVu( zU<OU0#AGH020Vp6XfzH~vMZz}CTGBgGGIdjpy9DRaG9R~%JP}{dBq8OTwnpKg2bZ4 zT$qMpD+Qz)rKAW{dBAk&fGPk`ospJbl&cV}WNfUYqo8DLq!g<IHVHI@l3%3Ym!Fra zrx22ns*sjhR9pfxS)n{LCkNE0PAo1i%}q^FD9KlV7N!cIR-L1hC!{ukItbQ2vV!`d z65J0=tw>BRL9_rX^Gg-V6Z1+G$`W%jQ{b+Eg@q2NM+k9`XByaHI^ba-kSD+$D~009 z;*!){xPd4x0CkG6*$xs1k03z?8Yy-Is3b2cC<2XlfJbgn9FdrmiOmg(Ntp^%wKy>; z6JoF5%m4rX{|9$~!Hu^n7Clf82-J)&3I`SUptAZFOJ06n>Mb@%<GG3((t1|Sj8`qb z#R_TGaUmLXRV<+18@OqBi^<sV7L&0-6-z;-YVj@R#JoyP8Sp^ZE!LvMy!6zfERY>a zAVL{LsDKD?pAOVXy2V_aT5^jyGq(WJh%PQoOUtZCEiM9g>6jB!QoxPxTWqNnC8>ES zx7dpFi%L>cZn1zGNsy)|Z#<~E5311O3ld9ivF0Y0BxgV>GSJA_Esmm8P=ZfQxy78B zR|2k|z->TqJN*`CYF=qBc*;Uk{1yjDAt*21V#~`1nOFp>?jXHH(6qrVPG|y8O)1g< z`2)FKk(60{i#0JR)3~?@)Ox?g2JuT#B1j>q?R1L;G=zPNJ2APWG%*L<NVvsZQjk-W z4N?K>px$Ckyu}W6!!5>4NGk+XJ%gJfkl|>!3+{ue;|x$G%g4eD8F1oZ5@S?g;$mU} zwRsu&nAjLWqqTgDa!f)@Tuh+hY98>=wE(#PD#a+qsKCs@D8vYA7jrRkF={XiF>!&% z`?(mkn7J60m}Qt1n1vX{7`Yhbn2JChNlm7Z5KUG;H$Oi=O@&+R@$o77$?@^GxZ>l} zN<nSP`1m4F=in9}ypN;@>LL{dfcyw*WrKtC7E@6wq@x8I$|&LnwMn>>^K)`ilR;zs z#YLdzOB6WLi}Jv|eMtHRcM#Y?-HFVc)S_CDnV{AM(>U=}>82_ASW0;Mr<*BG2u zAn^`rp@98zO9(aRg9d1j!W<Fs95%W6DWy57b|4QFn=mjiurTs4L7IV}!9Eb?VFE!e fW)2PxUJecpZVq-X9u6fA77i&6K@M96My_}OwHyRH literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f696979a8eafff2244e8c0b9f11d1d39a009a32d GIT binary patch literal 827 zcmZ?b<>g{vU|`Vf?~IXPVqka-;=nKy0|SEt0|P^G2m=E{3PTh_3S$aW4r3H!3S$a$ z4pT036f+}33QG!W3qur3DsvWVkzNWLl*hP$Z6QMndp1+P9Y`jMJ(a!4Bb6hMErlb6 zvxOmwGleObL6fV>h|4)Yw;-`3GbuACv!qfXxU`@kzo<kZEx$-1pt2+*KTp9(&s-rf zFGV3Wu_z}qwTSB_$bEjAjJKGJGb@rojsyvSXl4cm24|3iL4K-XSin%jxR5cJL6fn{ zgG)g{LBTz<EHzIdF;BrGBqYE$wYWGjJyl1cD7B=tC{H0VCr2S8H8CZ%s8}I4u_QSo zGcR2sQ6U|yCp)!L4{U@c<1O~|)ROqboE%N2TkN?ILvAr=r&g|HC}Lw^VE9$2Ur>}; zmRORiUzS*;pO&8kGE(2jSl`&p%&gp^#L~PtFFwV>DAzK@($vJ*wA{eJz#zRqKSaME zvp_d9uec;JCr8)9AU8WB+bBoBIJKm-pd>#(rx=-8P-$eI3=TQHg34R`P$$JhJpl55 zF(^bBSc*6p7#N5PB~X}hrKgra4bfyOVqsulC}IT>AfJJ~SHuqDf(#V`g*4a_##^jD znR%rZ$&8?wU|?VX(I5<t43Hr;44`Q61Dl}9c#E+D%z_Xg18;HI<Rs=Mr6k%(gG>b( zQ^W&Gmt42l<Kt8EljGxWaTMevmZaqu<wgl2!bC5%q9nB_uL$H0uvc#}2Sgg(Vk@pJ zE=kRe;?DuOE54x8C_b?`IWzMXb8$&g6n9Z>Nl|KQd~sr0D#Q(_-n+$NlbfGXnv-e= cN>RlikFqdvF!3;Ru(L68u<|gnF$*vP04PexPyhe` literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3848d9a446017f324074e362a42db23b55c86c35 GIT binary patch literal 1213 zcmZ?b<>g{vU|`Vf?~E~FW?*;>;=nKm0|SEt0|P^G00RR<IztpgDq|E=r9cWp3S$m) zE=v>(BSSbto)HT}Dr+`ZkryKa2&OQkFy*jCv4LskC}wwt6y_9`7KRj-W~L~XNQOM7 z2!<4<U<OUrmmqsI8E*-Nq~;dn7bO-|x?~omCYR(FRr)1^<Y1Ty<_--828L9ID8>|q zD5ey~DCQKV6y_F&D3%nK6xJ4oDAp9V6!sQ|D7F-iU<OUjB9OkS6<i8X5SCh0sZgAm zTac5gPy(}3Aq8fqLUMjyNoqxjLT+MSVtQ(k9$aI1W=@VmNl~RjNxni#YEEiNszPE~ zNorAfVo{2YLQ-joLODo9Voq_sLS}kieo?A|f3QMgUJA&z%$&p`xJju+MfpX=3i){u zb29Vu5Vj;ULj4P(K~8rD1-%FZ149Z!4MRLb3F88$g<w_+LokCTqn{@8Etb5*+|*kf zAm5~A=A_<Y&&^H&aWolku@tA~q^)EqVrO7r_*JN1P?TAgSdyw=mRO{pmY<W7T2!oW zWUOy&W@c7yQDSLcoEM*BVU%l`Vrgn(Y+7z$U|^75pdX@NkXfLcnO9trn3JPxVUU}h zk!_TtUz}P}T2PXopHqy?ET}X#OwP|ONG#DSsJz7yAD@|*SrQ))@<A~R$Zw2nj8)Q@ zk*x<)i4p>!PymMj8v_GF4MP^x&x}RPpybL}1QG^&4nly^>MhRr_|&|T)S~!!2~gO9 z0+E5SN(QTyP=(20moYFffM}2*U^|T%7#J#rN*ER})-Yr-r7$jJ0w;A57KRe$Y_1|T zP(o*9fF@>8oG^jogvl>NljRm$aYkuLX3j0PqTG_A)Ksv8Z?XFayMiKLlLhSZTkNS7 z$t9HqsZkuM70G3ZIi(O*Nl{{QD#S;ih${lQ2o#j56`-J$2Kfq{Um2Mgg&6s82Pj0n zpC&s<GboY7$KT?LkI&6dDa}cZkH5teA75CSm;;qzkB?8uPmYf-;$&c8C<0kf#1CSD zoq!-fjsa&XUXVLLJPuYCCJq)3X0WIx`z`kP_{5x?`1o5aAiv$>jgQYwElEtyNh~go zk1qlRF<9j-Zck8-F9C;05jPI2ZgJQ^+-nC)3&nh(NMd4PW?~Xx<YVMu<X{2-pf)D# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..153c552cf230ed29a1673aa772c787efecec23dc GIT binary patch literal 1436 zcmZ?b<>g{vU|`Vf?~GZ^!octt#DQTB1_lNP1_p-WX$%YuDGVu$ISf${nlXwI%x8*X zs^kH)n4_4(8S*4p7*biXxr%HU89*?FF^V~oA&)5nq>CwsHJ2@ljS<9V&SB5xh~i*m zNac*;N@ZHWox+mBx{xV~$DJXCErq>>A%(q}DT+6hFO?yMBbB$AIf_4(FO@lkGnHe3 zz(R&B!Di+t!4$?|22HM)AlLe7GTve?&aBX6yv3bSlA9A>kXTflT6Bxmzre95y^1Tp zAUQuJRUxq`JsG4NhM8a<lwn|CNM!(dDvBwEF@>pxA&NPLIfbQ#A&Mo1HJCw@?H0dN zWl1W?l=$TQ+=9fCWRPZ%K_D80ok1Z53d|bD8isg=6oz01O-7KzSU|conQpNZr{<&; zu`w_(tYjzxh3&6G{eq&*vc!^9{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt6bqwV z%M?pf6JyhI0|Ntt^aA}5{esK_-ORk=lEj=GT?>QU?2K%q9R1?dlG1{b{QR6^WM)C7 zu`$HSdIgoYIO5|o^D;}~<Ap)a1-YAnu}T8XZ+b9A$&4T$GB7ZJoXf(%zyJ!q;x!Bm z3?&Q;7*ZH(7_u0%m=-eCGL|qy*v*W!OesvY%qdK@EEP>P%r#8e3`NUo7;Bg%8ERQ; zSW8&4ShHD+dO#v6%;F4^3}6-uh?T-B!XVC2!y?X5%T~jj!e-7;%M8}Rmd#W&ql7(+ zBZXa(p_aXdt%f~?qnS~Jp_ZjkEsrOK6Re&Yq`ri+hP8&RnJJ8ck)cp6oFRo1lt`-V zA~RESQWVrR@(Xkli_$gK6$%nFixkrGixg55lQR_Z3sQ>`OEUBG6f*M^K=GxJpOlrF zT%w>3;;7$ZOez8e#Y->&3bmIEj0_AfnHd-uUjG08|9>U}10#c<Cf6<2#G<0aN^mUS zVo%PG2Wh{>oRgY&i#a8;_!h5+W0-5aV~~5Oud83kEgsj15LZ7JR~L{_5y;$IyqS3= zsp+Xj@g<c7sl`R0K-c6bVrO7rxW$@OS&~|Oi#atv?G|%ENzpBy)QXbSyp+_G_{5_0 zTTJ-{x0n-)(xW(Y^7GQc`oYNzLU4ji0L6YuYEgW=7%27?K#|KVz{tbI!pOqJ#l*qH z#iYQ<!NkSL#mK|R!py?R!Gtw!fQ|6eWCf+Byu{qp`1o5~@$tF&DWy3eHcxzfVQFFx zM5YLoC5q%27$9jL;uuhJDgwEvh?RkXK?vj+kViQfIhesBw>V%a@)k#FUTSf2VnM2= zP>~486hV+jxRdj9a#E8)F;;ww1(fA)aeL+#<QJ8=78T_eMF}GEf*vT4it@mr8zqe) zu2-B{p_iLqmRei{ip^Urpm4v%8y}yWT9TNYlUQ6FAAgGr<d>9^(t?~+aEw44$)28C zl2}qwRHOuQ5|>AauTKED+$mB9ITY+k1Of8yEe;z<DA|D$Qn3^$XEAaxaxgJ5@-Xr- Raxw9MB7=#CnNNv_831hEY|;P# literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65693f08f780d00be78578df6a1184420e381f3c GIT binary patch literal 15552 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 VIi&f@c^J8vSeOOEKx1=!EC7k+p?&}W literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daf2bfacbaef5f6390633c417208d004b6d55f18 GIT binary patch literal 1518 zcmZ?b<>g{vU|`Vf?~M7!!NBks#DQTZ1_lNP1_p*=83qQ16owSW7KSK>RK^shY^EZK zREA~-MuupH6y{(CO_pSs9#IAc22KVB24|2y9wr8c6vh;W9EMs5%~;D=!<faifH{R} zA!9954O0q3Hb=2h4MP@73UfA7kwpztu|+yVEmIy(4buYF8pbR(kh&7~8io{>OonFW zTIL#tERGV+8m4B(6oytNNrqaM8pbS+1zaWE3mI!!D|XbdxG==7sAa2Rt6|M%DlVyE zD{d<+sbOBgTmv$Ty@ox7A)B*kM-BS|o)p%FjI|s!9AJ@cH5?0gK_ZL{0StvDl?q^& z^VM?JaDr6Uu%$CDWQt*~<*Mbb<q2oV6Jud0;m_tOddJ8Bg5@QV40%iu3^iOJKNbBd zEU6Ny;RKmj!&Spw!?Tcuks+KRg`tLPfxtorMurHmE#V9${3&eBj7^Lsf+_4N94!nW z|G6+UGd45U@`C-%nZnr2T+5fjSi=x6R3TQw<iZfkSIbr+T*KDP$jC5(u`nc@p@xBl zAxo%+&zymYAzr9Nq=qGhQIesVF@~v@zg8fHp;j=Rp;o9O2V#0`QY~AF2uObnQ>}2V zNR3F1KsM6^#-al?f*{v}SS6e_Ld}e|f;A#FyxD9M7>lpK<sQ@sEf58TCL=?hNR7|} zu^Pb|wuMZL3^jr&T;>e5f)f}Er-U=q2!U)%VF1OG4MPe;FoPzy-%C(Jxy2O_8RFsZ z7vLD;af`J)Gtb!QmT*C0Nk)8TZb5!gNorAia$<5u>MfSy%#ze973ciYoRmEE5{0zP zycC6!j8ui9)WjSGb&#yOLT-LaX-;Y~BgkY11_n^7Wno}o2nMA<P|8hbs9}f|sbwr- zs9^-98cBu}hBT&$Ooc4L44RBDLHaZqZ*k-%W~YMOpviQLNzdRGOJ+%G?n;ItQ1<v$ zs9#W&S(aFms$Z5^q@R|blag9gtZ!tjZ)|2}R&G&ZX<nQcpJHK@YnftcYGQ0!ZeU<w zkY1o4qF<0%pqrUjT#}fRqibQ1o1Kwul%rpqT2fk2lAoVbjKa(;N!2Y#EJ@DLE2#X% zWs{RxT#}rhTVSUN@(IXWYz$RW@$pId`6YTbIr+(nImLE*2xYgp<Kt7)(=+pmQ;SN9 z*g&~j{1$U@W$`Vh{Nh{esd;6YMfrKRnA1~BZgCXkB$lM*7v<h!EiTB(EV;!F@_KP< z!7cXm)RM%KlA>EIAdy?lIjMQK*i$l#@)C1XZ*j!Or)B1(#>d~{21P|YB<OE(=j11* zz&OmAxdpelJ;4#_T2z!@bc;1PC%-uL7E4NIa!C;{0|Ub?uEdlSP~@d#78S9B1lSS_ z3R3e@Zm~gJuPIu@$H2f)#1A4sK96E9$V`r6FD^*|xhje^w-TfkRM6bwfTfvRY#?W( z78QXa{T5qsNl|KIZjl(sc-EBE;^d-R+}U~g<$3WSBZ_aa<>#an<QLy!Oo?L3ONruy z*c_i&a*HD`wH&PI7GuFJrn~}h8h{YoAk)|&aR5p<#R;HP$H>9R!N|iX#>mFR!^FcV z#K^<M#mK|R#K^_S0m4jNj4Vt{j2w&-jC^3VOpHuSB1~M2Y)l+XB1}AtY)o8?d`x^y z0*ow-EKEF%JWL`W8Acvv9!5T<B3)20ure?(_-R5opojoPNPIlRS)fD;VSydUVFQU6 QJFpW$DS^YCgOQC90K=<~-T(jq literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5163093774a593785c4470762f5512761477bc5e GIT binary patch literal 6808 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99841a717507a4c5a58dc7720de597fd0e5e6eab GIT binary patch literal 1512 zcmZ?b<>g{vU|`Vf?~HlF!octt#DQUE1_lNP1_p-WAO;486owSW9EK<e%^1Z9<}*bx zr7)y0<uK>6M6ob3q%fzjv@k@mrm&{4wJ=1nrLd=Pv@k@mr!p<zNa0+_7{!^wmBQV^ z5XF_k7|fu_^Aco}pC;oi=HkqXWJVB=fq?-;b1*P4ID@PXV_;w?VW?p!Va#G`W-5{> zVP3$J!dSzwkSUm<Ql*Ar0c#4=LdIGKgm^7O4Z{L9h-f%No(Ky=341nIQ2-+Y2u3pG zF-0)cFa$GbGW$g_`?<MPv6hyk=~`%V+~UeC&de(=Nz6-5En;F|V7SFul3Gy`Us73+ zdW*X>FEcqmB{e0nB=Ht!UVc$-VoqjN>MgdERFLp3w$wZ@%@Yby=UP;hU!=)+i=`m3 zBx5B*5jO(^!><zkf}+f_#FA9~vcw|&wEUcu)S_a2BV&DIGc&VtixNxo;=K423!_}i z6iZVRW7Bd20|SHf0{syEg3JP4u-kHSbS(^Wvoo@da`cN+OG*n$^7C_wk(p43#+R04 z<`nA{RNmqQIWe~&zc`f>6rw_)U}ofD<Y8oD<YMGu<YVMxWMeGiWnf@{M*#~10|Q7g zI0_<Aqd))@c%a~3$WS1a!dS~#!<fRD##GBxp;yD?!Vs%g%UsC?ikKSag^a-rEDR-V z*<3|_pulHjDA$T)DAbBzDAWpPNMQm+LRBP}f`WpAYhH0_QK~{oMq-IVNk*zddS+Q_ zo&qTF6f%nyKt4!GP0;}>_4D_0RVdF$%~QzBS4gcWNKGzDO;G@ce`a2~LV12sb}?8X zG-mxY*^59)862lYAg|qGF0L%TC7PaEl9rj1T3lINl9~(CU&IcIc_C;tx`1OB5}7PT zpsW(bmR1~}nwNZwD>*SQB{L<lB(?Y!b822PIEo<z56B2UsM+xl$BV+lo{fi*g^7oe zgNX|q1AL4{!l1ARr8rR3fM|H~S7Bga0EZ?+4I?x(8MC>H<RGC5%0&?jAX1a5O24GE zC{F<z`-tGk%qz)PNK{BG%}XxH%+E{AQ7FnUEy>JF_0wc30@-s5=2us63WoTV=@wgY zNl|8AdJ!nOKzs#C!bM=Oag`KRg2Es_B~=6DEs!w`OrYe%$5<o=5>aDdV2F!Wh$)Fl zi`7!r)3Q&_Psz+nkG8Un1&PLLX+-PBl<UQ6Yr@kUD2hNBoaQVT7(m&WVIe~;V-3Rs z#uUbdjEoE=ObeJn;ZVy|!<531%~7P0!Vt_*!?b_}l-(DwrhrqNCW~JYs0?`tB5tuJ z7AI$BYO>wpC`wIC$;r%1y~R?Tnwou!)7js})6YFV$n_R$ZemGt#x2(LqWsbVa01X| zzQvSQaEmJ~v#7Wv9;}No7d;sGQ&LM(lS?2Wk(rln4DvZBfEXA#7`Yg^7&#bO7>g7^ z#VdCaD+2>V5g#aFFcqan2_o{YUTQ^2YEd2}b%JssI5~iW@fLe>er`c#PHK@fNH@qN pBsU=9gTp2_KczG$)ehw2VgUvQ1`b9JMh+$(77iW`VGa&1W&louaYO(B literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..123c377ea6d69f0f3b08c6aefdc3df431c3abece GIT binary patch literal 344 zcmZ?b<>g{vU|`Vf?~Iwiz`*br#DQTB1_lNP1_p*=GX@5R6owSW9EK={N`X{{1&k?7 z3mLPRqL{-O@+4RoQdzROiVPSTKrn?liaC-Yk12v7g)x{xljSAIG{0M1#i=Ew1tt0U zImNfwOY^ex^2_ryS#R+cWT(d$r55Lx7A2<^-x5eqEs0ObEG{X^Oe!tO%+I^UUY1%^ z3}SG{$3vO%@wYf#E0R+SKnhke6mc>zK!{&?`UORqWr-!J`elhl`f2$&DXB%p`bNh3 z#%5+_<rXED=EZsODHcY#mMNB|CdQ`a1_lNO=>_^B`URN<x|w;!C5bsXx)uhx*%{eJ oIr<1EBQv3{&?~6C#bJ}1pHiBWYR3o)B~Wm2FflO-F!C`10Du8wB>(^b literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3173bb0679b60f134f73f8f48359ab9829ebdf37 GIT binary patch literal 6997 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae6913b897f09c0bec589c49e78dc6e32d3d2bff GIT binary patch literal 1027 zcmZ?b<>g{vU|`Vf?~FOc#K7<v#DQUE1_lNP1_p*=4F(2=6owSW9EK<e%^1a)!j!_? z!Vtxj%9O&A!rH>n%oxR-!Whh;$@UVY-!GXFL@_WhfM_NL1_o!4NfHbU3?&Q;7#A|6 zFlI9si9k#VW~gBZX3%8uyTu-!nU|7ZUYrco%mC5}G9ezMn+5ESU<OS_zm*J{Ot)AP zi_(j4v1ONo=pvAF!NjjJ{eq&*vc!^9{j$U&{j~g?l+>bPeIsLiV>2_ea*Gm6^Wwbt z6bqwV%M?pf6JyhI0|Ntt^aA}5{esK_-ORk=lEj=GT?>QU?2K%q9R1?dlG1{b{QR6^ zWM(<UrSZk31qJy<C3*#ww>WHa5_6MM67ASQt_69aN)DzhKQE_J&n727IWec$P7kI~ zlj#;mK~7>xT7FUPEw<vy;*!){O~zX+X{C9|V81{JHU<WUTRg}{v4U&>2{SPAFmf;! zaWgP5z=IqVPN2{L2e}V8$Ws`b85tQ$7_*qNn6p@F8A}+mShLu`BzqcD4P!h9n9W(k z7|)f$RLfMuSi?}m)XY@NT*F-KQNp-@dm%#;V+u1UnyR|F6ciK`f>TQrN-|OvGBQ(A zQu7oNOG=6|lS)fc74q{G5*5-ib5a%Zixg5ai&B$I@{20<xWKyHit=+6GD=Dctn~GZ zOA?c_^UG3;(sJ_4^^)^*^$SZ=i%T-|^NRHiEzOLK42_NTA=(lO5=$}?6mm<8OB9k) z6-rVoO7y_yRq-d6R2HNb>y>Bbff+ABNybl;=N4Cdd}b~vYU1N>u|X8wVgrR?PR=ck z?9`&X)Er}@D52og61U8pR7aTei^HQhU}i<J`2>UqhXh5jx`g`&x!mGNEJ_Dk62;== z@9%Sqy(qO9#E;?#&&+czD#|a?WVyuxa%z+yhPk&y-8_9<;~hgnf;^o<LtNuMJY8H| z{cbTArItXV85Czlph&&NnUR^28V?FXP{bAsfYK5t2O}4w5F-~83lkS33uBQODBrRa paWF726!C!wkW#QHl4%GdIc#$CQ%ZAE?LgV77-S0vBL_1F8vuLw3M~Kt literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py new file mode 100644 index 0000000..086b64d --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py @@ -0,0 +1,7 @@ +class SetuptoolsDeprecationWarning(Warning): + """ + Base class for warning deprecations in ``setuptools`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6f0a91ef0ed2811277ec467093b4444b1a16f1e GIT binary patch literal 206 zcmZ?b<>g{vU|`Vf?~DP_k3j?sGcqtRI503U6tgfeFr+X9GiWmUtz;+y2_uMK<@yCh znPrJ3srqG!Mfz#^IVq_{#rj6Z`o?BvX5|(omgdEI@hKKYxt1xGrY6Rw<pu@@2I&R* zA^HWG1-hAe#U+V3Il2}Gx!D=nMmhS$sU@WaCHeU|#mLO~vedkk{38AM_{_Y_lK6PN Wg34PQHo5sJr8%i~AO{tL91Q>|)HY)P literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f69010faf45f87c22e60439b943574f68f4ffafa GIT binary patch literal 203049 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ℑ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 ?4LQ87D6w1t zBml}(piQo+IccD7ngZNd&{1^?#i<3LBNRb5%YaWu0nhA!X8bW1QYj=QCTD{htDyP< z<}b*IF6_Jy$Pp+Y8}$^B*Kk1s1hm)!(n$s#o|1^DLg9u%{Rc4svdCCL0YZbPtx~~# z+<ega8_v~<#gG#!Y8BuuY0xoxiN&Dv9TST|r}u#l%C7}iczNL1fVcxvt3$>c!08%P zL4)Vap-1i2)`G?%KxgfPd$8aW$q^gTK#NHdOBBjei&7O}E{C0g0vdh>wMG&ljxNs3 zOV5FZEwYiAAqY<tMftg4r$T}f(hty6PzcTk9jgy^El4vWy(oZItATWbPJ{HRhB+uC zwW7o=zX;)zV(_9H$ikCi$Ur!BS{7_5q?m>5=PcGysLU@_0FBrxfW~@|gBo(^Bsg3_ z4g#qI-DC|)76qUM??q*x^ZxUTQ!z}1ggWjM5{iqGK{Y&h>NB$#JV2yilVqoml%JEL zV3TPFN)$HwnRW^``bl;QdHF@Ti8<ivT>-IG36!NkX+ASgK|?7?Nk=JD32pf^=n(JJ zBAw)%{9^F90BEQRl!HPN(~C7q64Mb?2)GtVECC(bfEK745JMES6(FatYCuc_ZTf+- zz@7&g0K$-}1k`py9S$fiO4f`vfL2;yMa4+-)6wcUJr7;D1~NNZ9Vuj>;_y*gP`?J$ zQv~;gL4_i8(E+59&kPv^UI;2&aV^+L1eLI$c7K&3S{NX80HJF(+-~v5!xY7X%cEPo z2!YhR6cl%X+y-_RWbC1aDT|?oDT@&_N*l}oItq=c=r5=b@(<J@ggO<m^#fcFfC+GA z02+r#gE<w&8c@FiYz^dY^BSfF3@MBYL37LuDNGB&)}=GnFo700w=&s4HhnPrAz95> z#0gq>L%;>MxKk@Y3x7*M*)9X*5>OwUfw4*j79t=Cw|u0DU?dHitVN({-y+b=2jtin z(3v|$pu;3J*}$`_w>V&h-7U_X{AAz6qU_Y7TRf?GDF_}Xc-8|n?N{_46msC;0TbXb z%4A?*@C3OG)Wc$s5C9*{BLcc6n+bGe9tUDh7L;T_sRdkxf`(~8i+!3I5tV2#gC=uT z0XU5#x?-hyDftTURc`8_Egz6u%)tBVLFH(Enu22<@^-{x9ndukklQjcLF36e;FBLf z*B^sAT6y_-x~aJZCD5Z8;9Yi*`#`}9j#tPK4`|I5_~=LQj2I++<6eeT3<?Hts+KIx z13M2hHES|~4}Am2i6$dB62Qhn2ylpk)@<g1i~>1^ffepP5EmYPpxXgKOKuRMSIY=m zbDhErYIcAcAD}Z8L1#CCCP5%g5O9B&Epa8b8Eo+G9MFP7NL2<d__I^<AO$+;C<}1T z0|hsz8cK!Se*)Vj16q`WS-F5C5_w5yVoD0Aj!T8Etppi{QawOV0M=E=$xqIMWOW5w z5C=T+3_3BZ2(b<msisOwP0!4O^nDeenn4!=5u-IVF9og<+;LE_1$zW?$S`;bN-De; z3hB2vK~7Bu9p{mWJbwVHM__d^sF7e3;^<^oi@2TxR{JGZD!^(sQ2z!TO7Mn45p>K4 z(t``nEXfE-Oe(Ieg;<R_oQ=7)2UL24FsRA`=UmX~B;bfj1)r*{0oh`cSd^RrY367s z<zyA7q!}6+=VTYBWMx5E*;!eJMn*>H)f~7w(EytZsnNg!DD_LU0qFb#kdf*-3Z}7; z@nMjQqN6Q9G7wADbrcLyB@H36*;!fYItoU{P>m?1E+~hBb0;VpV5@ZSmgJqFJO$34 zvPj{9nMH4LA<|zFsE=@q11yl5mx5BFg1QorVik1MnI>et$}M)V+4)6~42>u!a~K#H zN<l6Fxt&1-bS79#bgZtHo{Dyyy@qC;f+k~8Ea>!0Pz?rhC5Q%Pd2n$FT6a?eUIGeQ z(gZ3fAqzaggSB9*GznBC;DwS?Kn?&I4(3&f#KaibM^{9|MjPl_ChDd+>bk{hql7r9 zo&!4oG!O_{bqaCB0wz!`m%`l41TIrpAdabGjxnfs395KCnQyU`=4B>l6oHp+-eSuE zH8=~1a^qB(8>={DVho}Ubj@+ONebKz1Fh@=mD4FqkPS`ft^x<qOHg^P$yCI_%)kJ4 z5>ZZ>26qZmOl;9aQ0)i0L$*jAG!V*`mzthfl6s2;bmI;9k~nxt4N9jV3qes>3|g%Z znZoX5s8mQ{UI5ui30iQ^0Xd3pA!8PJ9U5qAmW82&C7Y|r1~TCaIu$j7AqBiyKk*Lc z6e@I_64Ky?O)wTEf+j>k<0jy>cbR$MwTPgisTh3hV`hFHXh~pxQBi(5r0^@Q%qvN( z0578iO^>El6ey@i$Eu?k2pyaRjRqoT_hPVZ8cLuP6srU}XhqjfK?!v1poyuOxrHU7 z4GmYBs9S|lnV6KElA4yDk(rg9lbe@cP*_x4Qd(ACQCWpur%F6XFUStuI#uE!dO^$f zk-IyPo(JgI_&jiX8hp)IbgVjbb{W+Ff!BVZ^qQ9r>dS$IQ!5G*^HQK!$$>UOCW0?q z0(D|QCmMp6nU>@$!1vlfbVF7wf?NTvT8b4?k?aK-3$j}wH?dM7DHUG#!OehM1Fj(y zbQM5nvlk~P7Nn*iDiuimoCrG39y}8P>PmwbWGHCBZX9r~j?t|JjpsU7$Hdk`N^Mlr zGEysWo9JAv9#f%StDxar9aCXsSgWH@o{^cH0SXz=6s)?UI#L~{3F)4KN_(&dg9>G3 z@CF9(a#GM(aX$DYd{E^Caw_P$1?V!WlFX#coXnC+m=P%c%})m3B%6^~1POTXXad65 zAU7I7-DqG!$c^yuQ~;-4&>TBx2MBaAKw?sUS*i|v`~rNgYNA34=)yA%(4nfjRqC}m z3aKT@&@&FeL0Ji!zXdJ-2W1bCfuPt0n*<65^~BW7{L)I0K8Oj9x={wYmhmbe5rjz? z#Rs^m16}0-YAAyie;4zC4l+n#1Qow2%q<L%vnx|rBpI3+K}!`=SV625R&j=ACdk?k z@FJcf&`ry5(?N9#xL`t^nSyNTLtnuPDlcJkQ`naEfaapsf=Wq{sVodt+K^n1S*aq4 zz$W$}ZEDaGTTNET>G+^^YLHVYUw{@DG3OVhXfobngsx0Q)TN+)8Q4}(RaPZ|%TDb6 zCT&LU7E3{55om=hCuqVRTnK=xTf|h{dL-{lVmJlnS<v<`&;;8pzWAb4r=mpAMP=YV z)jiNiBoC-s0!_Gqb|rv1&LF>PG8PGd#KE0{L<R<i*&v%hbA1d#9E?ni3XFV+&J`&9 zL9q(L#h@w}ye0>_T_4<3Vy=P=qC>k@kUjC>S^`{sfLi0=VKV4Gc2G+_5wr}Zurw3a z>;|a;-#Z7I<O0p=fU^?xq&n!d6QsZeHHIO@A4YQm)NBHukPS+4po7uDYZ2v27(o+r zDU2NqVhr&0h)jM}a^S`$ygve3*q&IT0JT#Ubl8M7D8RrA6q$>>K?@34K+UzHFi`)R zu?V!k1rcMnI6+r1rd2xU=j;H5Cb%)i$j4Zv2(|`v#)4ysbAApYxx&?h4bfzR7$^*i z7-%GcZ2(7-KLZ29X1KAeJk0P+2Wk<3q6UPEL5(>?^ne<3i92COjbg?QXm@FT9;7RR z8aKt6xuA;$A$67lXt!BOYEfbiWI#+$LBSOqO`y9{!0`k<-Uhrf3Vfa*xD*9-JxYoa z^NK+$nIJs^8}OJVyeonxYgenGS&MT*4gJVb^!xiDgF2w;%3|nFtNiR@&}bF3Vp330 z$V)`5&GFNBRPb|D!q}}<lv<FJn4AjgAc1-#8G3n%c}SbJz>8{ZK_-D$;DEgks+8ai z#H<-eDe7#IlChDAf|0R_0?2YBV-xs3Ph%q!P|w6fM<FjU56pseZcvgqD5k+l95iFl z!GLl)CwdcIlkpZi$S1)i(Cz{_6@f~(lb}=tF5P573ZPy^q)ONt7)YXIED}LVk6<>~ zB+xv?UXV$k(t&{o#hsv(2yWSf3JXZ99<&w|I#9-vD2g^pfLu0!OAYW537`@IbcZ9P zhYp%NE`~HC!OBxmZ=%FKMym{(N{3!guLIVEY#?aR20FhBZn8nmhK?P;;}qnM)D%b( zhV-8yYz-xKzx;Agg9TJ8hl3{}Ky`F}X_10UW-(~aAT_T<9Ujd@Dn~l87INb!I6zVZ zLHF;1=KR2|=K>7Rfc7duGBaXa0hBaB7{v!@7hfWqj>s!0I>6yVrk{xjAtgv^M^xKI zC7_ZQTneJ6Y;d}S5a5&;!@$6B8Yv}$atSDTgUVk}PYHBPMX?_P14BCl@;2p4i4ukm z#uR2S$<oY}#n{YT%N)*-Cj+|iJe#Y?3DQq0VFqnPu4RTSNCh2F5zklyT5QIe=#II% z16<#M#=5`(1}#%TDKIy&0DKf{q5|jyVQ^ax)T+<PQGgx`3q1f0Ts}hQbijuZ=y|3o zfZC9WDJhvCZHYOMhHzq0I%InRWHJRjV+1*cDGhSh7`R>ok2pc*>)`f+R$d|ugH1#g zL(UrmCwWj}2Cs9_0WHYL%u{f#&Pc6@2PJRNerV_pG}sn*^l})i6LgPiW?qSof}xqF zCcI@2Uagr7xpE5RG_Y;pph{5y9WD!+lSxGEDF)vJrI3_ZoT^}GhFUKuXh7C2f~Ia# z6><`b!N(Us&uavYOF?g<!d2DOBF$Ss{f2s640vrO%!?S61g0OsUIFDam}z=NrFkK# z#U;fW$XEY@R2Ud27#b=V87U+tD!92R7$hnfq$n6B!c73FQCCMgfdwv83ObCdJiiFE z(+})G=;BeFQ2@Hi7OV-W218U(U>T5cnz$XCTd4rL3q2)27hE(aDrDprL8r<<?gU}5 zTj6fR7&pZ0xRT70oK&oigA67@j&+9|Af%zL0678(k8|@7#c??(y%xcW;}m#ttdN_S zlB$rNlV1ehw^>}8o10n$%A??UyyDV4ke15)qHMUA;GP6AFoq=wMJH&~($HK-!PrDc z!O+}5N5RO{R7b(kKu5vQSVzIg45_py5ZKY`zLB8CvEH73?k@hmAf}st5QqXVul4W` z3U)<4|CJ_z5e=^LJc|`TqYuz3&p%DUAEnAu@CAjjJ1mTYAz|!PsQ@0d4=&A9@J~~S z%rDBuHUS7~KY-ggpm`tUQo9D+^#rwQ5&OJB?GMmUB3J`x*e;!+h9Op{ma&7ehB1w? zgJB+1AHzhZLY80#NTmU;RG>R2SxWM=^E8=?mV#=VXi#?vBn#<)Jz!v9_ywz1*chrH zXH)qm79g5R1&Ii@4e00zP?=;0wgzJm5Qi-*7#SFT!fat+tP+8hEC`be5+TR$fDQ}N zWGTuAIdcZc!JuAUQ7vTmCD`#`Z-7iJDh4S6`31#VaDAE2z`$@5WFx3`#-PB*%*4pX zD8$GII(Lo<rB?w8T5vlK)T;mu6o6*bKsQZ6CObh}DZ%TW@ob-G6=q-nEv7}id5H*v zZ?S?ecEn>e2i$0oaiAI>RNHehFff4Kyoiwjbe0eUXmF!Qu7;tO3A9zGhLMLMg|U~Z zmLU&x_a1XCQwd86YYAHl6KG(gmbr$pXhsP;==9kIoF!Zf8EaWexRK|*N_a|mOZaM- zOSmEPUNtPR^`7DkCHyIDDeUQtDIC2_3j|U)7cws3OyNr5ZedsmI@gFhg$KM?hc&M) zg?E7<WFt+95M(f=maRk>VQUFX4O=s#6KF#cR@)bFmWV85Ea8W^0^$Y&?hwFqM~P^O zSc)KMPEVX6g$Ja+mc52`fk287$bB_T3&c}|Q$!XrEs$8qus{;D*d4T6b%9ihXbt$F zty<O^_5}hdVgyu+LshfaFx9ZeOV=>fu*XZ+u-34HZ_|~i3Ig8?4q6`rJ)Wf`A2FZ| zx?eO8)Dr+r4T45iL2S@+3B(*-u?}=WQX+Wm5NMUACL?%3aTRmCu2qp1sNc?9l9>LB z(e@XkzMCdv5i2NnfX=Ky>9&B95qMk-l-yz67VtWJX2>K&ktDn;M5s{;>S#&85@?ll zJZQ}ZXuSp^SHrtm+91c^9!3KdX^;X9bX#9Gdl6F&Y#lo2JO-vBkbd~>iQrY}xJJ{Y zKn?==l7*p42Ah*$BT6(47I}~>K-sm5$wt4(or!_r7o!#QG$R|;V!NU^&_+O38-3Mc zJ53qL=pA_3IjA-$0^ibS2rB(RCqopOf>@wqi6OIP;N=LQ4gvW1VYIb*MY15p(?G!u z8ZIk}0CA&1gbRoO#riF#cpu2_LsoFZq^J)h175Q(&dk7|$#ILVBr!d>r05oNMQ#qL zhg}RxZ@0Kh64M<^N{T>7D&69Na>5dGN>gvKgI3;zB&OdI1veZ(=M5D5q!t$kIVORI z>TYp>Qgv!bVmi3mfDoW^`W7cVhPXi?2D<o-fr*Qeg;9WsjfsyDbRS*_lL(_2OAMn3 zlOCfU_{yRpRc5qX?m(3(xIhGr?tu#N6vk#y_k}4@0dvv^et#D+`3~G31T93u%z%0d z;C&0w%ce>a(~Ch(^3+VwxnBz4RwroI09?W=fcA|+*4Ji&*0(|zdVzwq7_^rSwD~Fp zG8X~qk%DxV=0Vwz*$>pN0aD8zG*+l!tDtUEl49ozT9KHUmzEDY%pKIju}M_OC`wJU zRmvzSDX`Mlhpz<DE6>c%gjlYZoS&;?2bZzYPqb42$tn~irl;EIm!#OK!&`~U3ZPsL z3J_3Ehwt)(Yerek2AZY-IRcbAKxG<Q`372dsF0{&q+3#2kONtm25NgI>LkWP)*m2S zrJ>}ggy^^DWaedq29!Zt$Py6?zQ7taHI%^8pm0$FE&c+F!hHZ|fLsSs2#Pfj4K@#T zDHzBIw1sNQh*iqq_y+mU#?cO3ENkRsW~VABfdX6!bjnnDo&xCnEKLQ_2n=`%2YQ%( zQcfzU(+P@y%ux(b7=W`8=t#zFJ+RY24$)Ci*9C1G0}1GX?0^IZSSj+9A|fty?Gy+^ zJ2)^vwFM|kX)+ec!U}&x9xd`^U|`Sy<xWtk${>i+dcv9Us&;{mh7QM)THAqhU4*X> zQJD^WATxCI95M<3&V2faoQIZmK<ndSi{^c*krNqY!82&%IiBzU4YOFo!vk?&7AP!0 z7_?>#d>>p5Ly=Go=%7&WdbUmm@X>G#3mH1WyT)4>Iv7ChBGA!tX^fz~<KTnkK*bhY zq74Ve;$_Iq(F%#6;pxnjMDT7C@Th`9B4n>?Nxni-Drm|YT9SZQ9D&khF=P)Gbov!O zY7O#ugs%@MAJ;-BIMG6*Ru8o1S;4s)qz6>=g9|UvW*G(0#-+@(O3;)oXo)i@cb6nW zE*AtTRsh{51fKawLF5;Z%S%DWA?7P2g74Q(1FctutW-`dR>%jR6_J~t2XQlW{uP{z zoU3g@T<oBZv~lqavxAMGJA<y0#Bd<g3B{?P>rOyDUC>qxu;am3RzQkdXtAmQxpch} zG*kl~i~`%3pQezO3A(}@;e6;KT*Uq(Q27O)cg{|&1PwAMz=xU;!%7;7IhpBswn{~y z%XgGO14a4J9j&^cQUEkB4ZZ#xyeR`x4>(tAY1M*is3Op*&!Ac3)I87>HmXlRqq2~K zMIoTFBqJZPXb)6^D1f&2fR5cvQ2@CM;TkQiYNh0y#NuKlD<$XB;*$K_)FLGv1tqW} zm8_tytc7F+(CjQYP(XnQDz0?Fp{4*Xu|f0x;4)A{K|?98*w6}Mtd0W0TumLYl#vz0 zbRDSanhKDz3v>h&s)wL8V<IG;Ky@SN@Ts)S3Z%8qpp%Y3#V+I^Cs0|DtEZp<PoLoU z1GyD4bO@f90<SPAPR%RM1n(^a-2x99WkM+<AfW~sc=SwD0N+^v+YS$^E1avr{;O5c z04J~fB5*{3FTO{(Rugt$lMgu4fcGBO!V+spz5--A408S+$PWnLr&eSZ!_GhjSpYH^ zJOPykzK|50??Jf-G!zQ<B3i1~bM%Xh4|DVhb*%-ZDv;sexI!!Zpb1t%K_R0g7j#D{ z`oNt{N@kfI*aB#PC<N!{rh->=qlkjkDU?(eq}nQ_7iFd>*%>OBC>SUhDj3-4V;F&= zII$o@$<9#6SiwlgSiw-o5Qlm@@K9AoBIrCUutnI^VOj-pHQb@do=eFr(@DuJ!`ik; z$t+WX?s*64S5^R5D&VA}kdj#jDv=a263alvTq4*lh++Yp3Lr(B0wg5hwu5W~g$;PO zRhb6H04pe(;mKA5DJ+r33PJk8Efa_#@gP2;!2@zz4akKcUukM6f!0zXHIqQe7Nj9Q zBQ-H4wFuPG0dqkeOVpMQC^4Y5bifS@4X}EMc0G{kkc<loB)B(~k-D;pkm4K?D4-#I zkPAV5SsbB<?K}x^vW1%t3dF>`%6L%lK*E5ifJ6yfMBYFOS&+e?fPfep54QupeE{Ti z0)Y!M0}?o(um$lzCK4I6AmtFvNFfUjb>!w8JX=B5u!2G!Aq3)qFj8&;2b>?gl?G~& zfM$unoqo_N#B|Wmp+F2%EojpfV+~Up6UM+HGx*50q9>q!;e8MR8e~Ii5rReyt6(i4 zHijxi)WEg@E#b^5w$nol7s5N+pixZF5EghO6EweC5dmrj#RkNHPf-U=J!P{Ose$@% zHH;~YHO%7R)eN9ZT(g+6nTyzJm};0M8ERNSY^W;G1x!%UG-k-^he9^c>FD4=)GD#O zd`O}M=iZW%B1l7^N*hu3s;d^OD}YKGaMDu%adqIU-9S7|<|5DviK2ASx*AS+Nvp{U z*{lIxH@gEg2Ezd|6x>7R1hK%~V@<|etRN2b(pON&w+J+VSq%z8P>-B}k&lssQGihl zbdr-Kj=(HP)MPAr4H^h#1`p-l0$T;z^a(Z$96g$hMVg=%JlG15TV3E*7_l(&F>x^R zG4im(H|4?72Ds}i2fE;wv4|&yv4&BMA&)7A33O^^8UyII;!MUq&^Qcp;$v8MIvBKe zA~P)$bk{;^QE_HIctQcR7y`xlwY8vS=Xr?m&j%eR3CdXDx>P|IJWl~mvMHHqX_?8T zIVB27(9;&-6>cWz7#Zj;CP;Gzl-nQ;9-3BfU`G;Nzrj_LRKcm`lvt-^mZ_zeSc8*b zUcLg@Aez^9pmGC*LB$ZLl!ugq*b7&1J4ORiy&)B$;D`g60n$InYblU7;blB%`!kLT z8RAuxR6OFUk17t;Vn}QL7ArV0YBGY0K27FZoM1kvd3}o$M1qHqprW8c4qOgF2yiKs z%fP_U3Mz#_l@No10OK!4jiMaTLVd6R0|SE~0|NtS{Q|fYTEGOF(P#$U;0-EyK-Xt5 zi!(Se)Ur-ss;DYq1l@h$!Z3j;HYbLumJM=y9_Sv06lT!Mn-~_*5n{DmwcItFDJ<Cx zMIkAyH5_6Ld2A_cAi9<ZEY4KaQNxkKl+96GQNmQi(ae~_p3Pj;P{N$T(ahMySi=#+ zRLfh-2i_mVQp2;5v6jDvtAsU+4SY;kQVnMcXEsyOu@d$gR?q=u&5R`+HLN9^Ad^5d z4B`y60(rA)I8)fc>Se%oaTfi9sjmSoFoo-Z@ZkDnz^af{fVV$`XH^99Tp;eBz*rOk zR>v#O0McK>2caP@slgBhyNIKNIfV=4zq~hK-*9C!O<*c=gZO3wW6_Ed?i!8~o@S;A zjKw`AJRslHa+I*waAfh;@Pph}!coHkVS&w?1N9+O5d*}B6BvsgfnCKR&Hzyd3l|6v zWCmC##E&pDK_SNv@*fD-BK*iyWCJ!0<Qsl*2CyIDdcb}}5e1u!@FR%D4f1Ub_XMV* zsuJ!R?h?Kd{xqg$kgp4B1hNEbxce9w8S=Pl1QrO?aD$FiuHml{SOAXk8dfI;Z-!d_ z8va_=LZxtq8kQPXZ&0cP-Lt`y=)#3MK7+Ix6h6ERYHp+#CFbTPg3bd$y=?<LJ6~F$ zke>!FLO~~ufV%m`puRe2B?72^1D~6moSFi<IawhiGqnh`=crOoLBYQu6+9>aI;0u2 z_FbVAe3}Y$Pyw`zx~Nh|AtyDhL>DxU3?6m>-AtRGoS6vf{^}_xfLGu^2aX^IfPhC4 zKu6-2lq4o+K*x$o^5G*8$OF52;AwHtL<;B(vlPg3EKqkCcJOggYI1&hUS<_!;R>j~ z4)JChNNH*w_}EME8n67a)S{xy6wv;0h@U{ceW;&{6*P)dK_`uZkBC-CO3leH*MuyJ z1)JuVUy^DC+w2TqlavCwG!Pb^;GqlX$U$PI0?0U|Gv^dCi;GL4!}ritouD|&%uCCx z@XId&FQL;@0A13DzRo5Ue57&!<e+89fp(CUExD=58HstB#krtGJ_Y$Dsd*)tparA~ znYjf;`DLk~4ctYbKmhG>Msf<Y6@%sYJJ7-)&_ZVgU8ERL03A1+S`0EBe3*Z#LT-L> z31|^fW-@H86=+-pJf@YGT3iB+PX%3t`~uJg^q_rynZ+fbQ61P&PJSL}V_}g(YGQH* zBGwCvQlZhIkds=LngdFhB^j{6dQfKvvUObnn$oQy`oV^R2B)CA0zivn!I7q*ppjny z@{f)}UTJPfYEf>njsiG^`lP0nI2IS@CqwUFb_9=VYJx|;ieURY6u>?J=?57O8sk8W zb|X0k)b9mJ!qNfc+*(jWMFG5D1fJNziwyJ9L6&4DXFx7;PD%y!XF;bhKvtI}!cI{{ zHYGC+?tYL<jCB+s-U4wFA;V+fz%9>5ind}MSfoJ10_38SazrL8hV7dGr9+ShjKPQ5 zL3SA_fIJTiG>|<Y1<-@^K*0<OOQ`vo#fTWx0G$_rWM5LMf}xIr5%|mrV|Z^~7cCNC z=0op{01b9!q=IL*K(@ldRUs4ZGzA5S37`@ORP-n$g5nZV;DE-&U_OG!mo6mBrXV>D zTy!Spm4LQ?<`;kygI<uQyGKYZc+l0k8YbxD>J|b$0394E;BjzBf`K_4ECem#K$#I# zv_V~z3K<|rvKWzcKxJx4at6e;$iawEqM(7u0H6p&wFxwprI4EnKHd<rHAx{qH?yQ9 zHAT}JR9Jz64_OD2E09jffTf@!a0v!VNwAfTpi3!1*SusFE2I{dW|k%9q~?K^1tOUP z+7=7)fO9q48d$BgJk44K4fN6sRaGrCP3S7*6eJd*7CWGP1s)Uw84rqO-Gam-czLb? zU4d-tTn)SYQ$t-tT@ztq5q=ZF<p5zLHNi%LJ&d`d7kngAK@Otc0FC75mlo;50#G5b zD6=FZH?<@)88S+h2}*FFsmZd$qD;`#HDojwY(6M{K`ZPaD?;IEHy*O7Ko4{}S857u z%_v+)Sz-~WX{=z2*mw`qk(mN2w9_(Eiy#BdAPeC7z%GMzqfn|L4VWWpK<8qD42K*k z2GS0~(Qq?BJPmbS(EeahnS_*yG*Pu^fKTDmP}fq>SJ#9T2+%AC%3U}VYb)pyRt!Bl z1LP98vk+d>!?|SCRNGj~46XyDUBgt{SQAZ5*GN~_&=5tLy1KfKLRx7~j!S87fi3t9 zS4bkp7)(R8B0AbsM?qa%T}L6>SVuu!OI=67EH)NtsUo`l(Fh&Ju?QWAkvTNSMMp=2 zqrwQJ7!)TEuAw2w7LW%u8U6f<l0X|{L09utv8#d(SSiY_;#4h$GQsCdRyjcG8_;Hp zVp~LI11j1<lYa0T2T@*tsue_;RSe$6TV)0>xM4aWO-BtwO&#d1K?)j1n&7&jB((_K ztkf{ptTIB?2dxxRahCX?eTagP!@9xeBZ5y#{0Ul=0$yek1{y_U0VT5{(E2>c9Xrw> zK~`{a4_OZbUdaN!2IdDyC-@jf(ApPG!CM@#R?#gsNPFfM3#hQV#R4i|z<0CU;s7m| z1~n8Q$0>qVs1&)RrhznoL~pTzQe@>VK5&@>Z+n1;(r$5p!Wle>#}2904M8hhK-!ET z7Zie+Ma-a)Hnfq^Yz78~HK5)u$cqfNY~VpX2}TJ<4)FPl9N<H{Il$*IaxkhffzD$T zW0YayV&q}uVgeoHF2e{qw-HGOd>gs|BM%c7qYxwLbjK<aB@KJ4=s2aAyqKbxnAjQ( zdn+X+O%N3m1D2_Xt*HR*Cx-1v*VNS1`o*YJ1#RpoAaA2h$u9*hMgXrgDXub62OFS{ zWVE_EVWZWt8Vx;U32L+!n1*gIQGhIZhpNagQb2LWEymI+G0^t+{FGFfo1up=qg-kX zA2gT;I_aFDhB2F|NT7rvg%RBCV*+*XComRifp*4~fVzE*MM@=%HH>gJGw3Yy6y|KE zq7@~~pn(MlyM{T1DVwvX3AAXkhMAuMbmlqe*muzB-Qo<83obxi*=EqvN7fWJ(9*|R zraYArt_9o+(Nu%gutU^{Gt@HWRX|OD12>%q<O+TUafT8ekQ=}(HjrItHgP~qsb$JD z0qHG)>LZ|w6RwM+gaOk1FX06buYi3yfw3s1h6U6y2Dzd{poY1I#fhPY$q9V%WC=gW zMIgU|y1scTC@NX7tEypHAeh1p+KULkffUkZuH(enWd^qdK}`xsR|VYWLEY_*Wd#wq z27sLbUR120p`@V%ZYC;eDuEZ=fLdD67KtYA{uRjNR8TVq!~nSgzHc1dmQGYaa+3m5 z3r9&qsaDe(d{HH$Hvw-TAT|2I?gSk;4msLNR{^vZjueYDNwp|H57h6(Y`JBYq~=2A z*P*Lrki1rm>^Hysyi`P^Ei*kYzbF+{<Y6%qBnR>gEc8I_D3}M4BL^B0w$9ba<v=ZT z&K11<2Pw=zjd;*bRZyQfGbJ?z92KDWgl;y2ud)E|2!citIG_<#9;7puoLEo-y1pH> zOayWFDAL*SFcXtfOUhGI^I&JWrWQeZHlTe(;PeP;gToKyD+8^1gl)$QErtwpI9DS= z3hC@S#1*Uvw?Q`tgZc*``x7%E>o#D4m|ujMNT6DvcNc;JCn;3{d`Layo>Hh@a3EmU z4{E%FVmuSn--WKO0dKE^ZTbUs-9V@3=jNv7LH0T$Tnswu4t$AXr9y6LPDv)Dg$+7d z4m9^u3@y+TLA$7Ys{M-)3yQ#NB%vq&Lk4d^TPmQ*0Tj<Zs3`(+f+?uEgVJ+`<Y@2; zCrBu#Kw7gUpli-SOCl7UtHH?@np8kjM$mJ-p?M#(s{q=J1)EleG=`PH%aStlz;{Fz zl|YW`1r-PiX*v0cCD3XLX@Wf^H9039*&Juc&9oW_F>M9^0?3{=$eobtTI!%Hyg{u$ z5C(S$6rj7!AUmD3)#KH56u@lI$@m~Hq&W*x5AE<{=~_T!zzG1PFtI3I!Bzo$zOe?H zGqn}KwjvDm32+S32?}rwQm|FXO)SuWb>DOplr%Jv7e*xKr=-S%mH{Z(LUSFcT+mRj z2JO$ORo78~L=H&MRs%VwE7T|?2bWalq&nw=lb0qm=Yw3D91riC*@B88<RH~h0?qp? z!A`XRDM!IjuV^TN`b0<(gQ7@5TLI)l1*E8el}(TvaubWvHFXrCV>LCDKwA#Mt46`W z0S`@d^WXsiTXTU3OoVszAfcgw>T|f6a7J-{X;E@&JjhJYLSA*ma$AtKpyZfY9G{<( z0_p`SRA?$xBl?aY1t1LF#I8}HYNTn6Dh*x91yTjYaEn2Fknt(0$?+xm@foQV8sOBP z0V1*5lbNQV0hR^b_MmQ{uAru-0O8x%DyUnkW7Pz*2Ij#0q7;Y$nz|sSx`DbTx`RQ= zYZX#+ic_)q6eJ5X%+Np^WC+*+Q1cu?=An2Hq@fm9kRUG*0u_*;ln5H*M2f`XRM5aX zbYC!1RAF5%qok?<N{O1q3L2{56+N28nxNXM*h)cF1C+Kji<J~q!TV#OIRK-N3W;k4 zP-MfjMn|h>=9Pf*ScN+DU@wrb5YdLN8WevZ<=~KkX{pkKRubT560DYnoV5d<1c22l z8L0}ziMgqe`}<($YQeS~gJ{r7VDN$x(CP)y5?4tE(ESvMqy97*i?)E4D&RisFI@z> zX{t&FR4G9YSHs*n0$;~MC2O-_)>7Nx0$Led0yDVEA6xXn*PFuEtH2@@Qip=t7oZVB zL{$!|biwPStHdB7uK*rwKq$}@DgyV_5tku=`|qH*E&}z^i?~5+f<PyC7L|f}=AceF z_;y^#{uI!yjgY>-Fi0Kff^Nv!(V)J+CM&21o|>0hbc+p?0#l1X*L8y%tVIVw;~=dd zJ!rk^AO;2oRZuX1PHkkc0`-Eq7$LoC4n`S99wrI!+7=c@3DC7zOk!Y?gAsK1ffkbr z=w3t6N*B;}9FWUF2TOqX#h~>~h;u}0nZa!46qXi_S{5)H)VbrRWd)tv)(pCSm3<*2 z=tRh7##%PeO_w0NfVGANwDWBNTMEZQ##(l$81q8L1#F<*akU&!5mvAWXty0_4O7vw z67~`f(Ehg?c5%=SKF~ZXq{{^s1$DW^8EQB|bS+n&3QTngLk(7y&5X5NH4F<lOSnoH zn;FCzz;l^g3)oV)L1&_A@+5K*(fI<;<Ri6=GxI=WmEc)0g`}MP<m_S{1!%JoT)viM z<QGHNn<Lt|V1)|BC5a`epjIS!c`#(5jsm3UQ~=d-&?XtS=`N5(!7%Nhb_8mt1Kw4H zp1GEvhOi90sut`tP~ix|nZ=-)GSF3@kRg9)zX#&8)D(!fAUbqG*JG#Vl?0c7PSe(f zwD}=x?!jkRfd<u6i$F68xrup+>7ZM$5W!On(gZOFWUYdNf(E>m3=a#?VJn{CFilNy z0(ldu!vpV@!H+M4&ZnUm3T^xsXMp#UC_o0Gk=+e#guwiwpsSFSpP!QoK5YPg_jfsT zA_o#xuz^5Cn50&MZrMeh<4^$4B!aFa0hJ}-nLums8Pp~D3gGcpaI+g?VtyKA?ioBK z3HLpuI|U6LP%9673azbkHRQ4^$PlU{XdP`PG+rPD8mRnA%*+GrXUa(hoqzzEr*y6c zTLn)ium#rG+xTd0s+80;1xJl4l<M0Nc|aL_9h89qQqa3A*eW<0Aqk*zjNvj)a2CiG zCnt?Wog|%P6sw$^knMsfbJRdlqM(qJl!&YfEP!l3SO8(IGu&DiI16NQaY16PMuko# zn(3gk2o+M((~HqU0UA4??iAb@Py-1PIUrd`DuLt?TZL#t$dM)>nc|XM(2?A3kaIaS zpp6@l47jfWS}F+Itc7%-15y_Unr;;ozzrjp)MU`YbPc7H)HEdpXbT@=fHt&4qW~K0 zL2Ay!yX}znJi<y%1<(#K(2x+AwnFM6fSP)+z6``)(0r)@@(bu%dQb)j`xV`NX$r8O z6~e*VU?#*sB;OZ-#|ji|LDyY_j_cDvHOm<^Faa|R;cU=l)fynb!~2e?9TteGnqWVH zI%uG924RS}f{l%W2FQD0(`z8TJxBo7fDg0O0QD=8*6}44gJ!Zo1vcDcsBW<Zxdmc4 z!u_CN0$T<4xl3xALJervH#0pCY!ZsSNFkD&pHi9w??w9OrTQ0vwk?7~9Z4B@k~E|! zH5Jq+MQA}enF!R&Mz{yAL$3hbsD=hLn2o%mIyzcCB{fYQGJpUIH3bEAM-*<fx(2BA zTm>RD)nidqTA`|pR(CW6U+ji*Bb<SOdMxNpk!W>ykQtB*;EW(*>W;Ac;*8Z}W04I9 z-6;ppcnVlt>EwiJImDTXAS;qUL^6mV=wK%&n2W)|prG#L1Ugy+>S>U61$8UXq*$~% zs2l?O4#a{wJ1Hp<>~J)<J0m+y-36J4#V4SW30a8()b<LH4=O<f$Q_8l0J{i@3z}Jj zx*k-Jfm{m-40xP@btptftAmO&P(a7V#>PUrf$-Jnpe2YP3~H!?k58&$1g$A=X3S<S z5&&HZ44N;fVQ6N8-1!SSCO4b8$P0A;FPP0zWCuBLA%zKa=3WUiXxux68N>$Z)@1Pm zpYc@1pP7@Bnx2@W0BUe&=A~B&fVx_V3I(aDMGC2TB}J8*ERbu*!H4lFgWABL_2wA& z?cQQbE-iA-&(UPO#SJO5z~vKSz2z<b<c!qh?10qNB1l`~EU4Yg2WtB=@-VP4f@YdP z7spnqLA0krnj(mf7n*kLL1hF!Ik<)qEofMZlsXs|FxD`G+Mjtm$Uy@R4rXX@@IicE zT$%*&J981(+kBwT1Xgbsxq>#PGZwkQr`$kmOK<Uk9UEMl1o7%skXJ#Q3m72YWU5ld z=SjFe?0y7o^TeGTIv9$~;K=~SW|CycW-NAs`Wu`KIv7Ab21dvY2GHbC6bHHvm>(Pn zc?zX@5J#e<08l7EZaBcWaT$A1@PdOP6l&HTP)LCKYYfmxmto{#tWtqkggwe(TC12i z6>hP4`nkCJg@6wLy~Ppg2jN!n!3=;joHe;2-9b@Ma^(PZ-q=6{X#XqteEuR(hYvEj z3!cm60?B>?T^zxEO9-_A2Wsd;VpkuO2;4#O>;WP?L4*@X%!`?U;TB7Pt836LwotJ1 zZm|{Tf;ED=i<;2X0ZJG}84L^z^`J120VRAt9u6LM9(EB%2}U7CAx0KPCMF#wP{&b# zu}V2Q#-JkEKsUyqBE<|uSb&&mAZ8kbnHF0m4pNk82$D%k11U0(F{ns0kF8>gx2j?X z?Q$wfOs|qiFHy)TQAo@!P{>OvhMZidkXVpkT*YQ*qo$ywUd5xPVIN=vS^!c~X;<_W zbOZ#GrgfDNv>^}LRSzl+GD|8^Mkhd>Rq*0yP>hy<G8jV^6S!l?SQP}_VGXYPijdYj z6+upTgmn@SW@n~CIvb!CeP)pYc#C0T4&nggVol~-eDR?DV6J&3nI)CJi3LTEKy&kK z5QpP9ttOU%f#EwS$U$R63`|ub`Y~GI$z-kA8W2lSUsF@7ib+eqir-nG7&H<Lc3Ns) zNfp11qONXqOmR$btd_m5u3Z%m*tMWg0ZB9IX;txnZd(FP!Q^D-rB(^*>ucCs#l*zq z)kMd|<i%=gRdMO-!_5<P*49R|f>~Klt4ajc5k<CLld;GT91#kfw>UvoCVG~n=0eX; zNd_e!7zRx@JAe-TUBSe_kjfCnn8Fanl)@OroXV2Q+RPZmmdcXK-pm-qk;<9M)y%kn z8+69|0-jX1g^W?Wshp{NU@_3h01rq<3QIH7LdGcmQ~}T_I}5l|*cLKERSTvHHZv^X zN#$6`n8Gg3fZ&NUEZ_!>Geilc3M~*$;Y{HIO+GU+qza`9ri!GBq;NMgE)ZSFkSYWk zIRLGjU%;Khvyd@LELCiQaH=?{Tuv28;RU;d4{RUDLdGbGRDl$Ju$TZ`Ofpq6Rl<oO zRnUoHfz(2VDCtxI&^bB_xKo7SYGhJ5Q)N?x#TioNKx8x10`3%%g^W@1sRAjYVDrQl zGDaz+3Z#gGc@hg5qZCsWQzTOr#TinhL>R#SkzU9crIacH7ncEvH#4TliZft}f_2C( zWQ<ZyRbHTyA`c6J6opg;u$<yT#wgWPwN#~4RVRj2WhYRGDS@u|UcjBAw2(1MJyjq@ z8SEOBg^W=eshTOaDQYR|EsV{KQCg{*DRwEEDOzBjcB(*%Hdv+3LdGbaRDl#-Fi&qG zW0Y>HK#D$?XRwelN-tF(9O?!j(upC;FjX_fFvX~ap_wttC{-=hIMpP@xS5fkA=R{* z0W`s%%9(1GVw_^q%LMkLd5S6MHce2RH8X-jdjWTf*+RxBi&V>0kyNV%)(aU@Eu0uq z%u_6SnZUMME@X_dN!3hcNwETj07!R~Etqc&=i8;&1T$#b7ZortFeI)+ELbl}1y80G zgLd_T5`2E1LQa0UF1S;VG9*!wkyrv=E(<wU0DNOdo<de>Zh<cNYyr@`FSOiA0j&+r zF95asp&N{KLF;2vi!zfzBLlg`pjC&^HEhK;P=;Ntj)G5hQEFmNu?>iX@Qaf(K?O}( zX0k#abP={qadKunL<O|9uM5uX`FRRH)dfZQ>7Z5iAlD!|EyXqnwjFc^L{}j%wFGpf zph99wN>OTYaVpqZzK+f|xrxc~P(g?*JOj#1Y%&YVOfZDaK*DASVYrJtgZ(Yc3=9=~ zs#6k6Qj2Xei}OKz(DY!c9b^S7M5-h+Hx)$|B!F<FPjzUhr;AN#X=VztASkL5bzxJ` zDc}Jr8?azJTreJVJ{wdM$`XHgq=0tlLC>ZP$@k1FNli~JLhSWNk#z%2dE$_BNi0dl zBL(shsx)X&x&TzHha{$h?qdOWyL7>K!<QC-PR9uWUBZVZlagPahav~=0ALRCz?WUX zR#`%(LUFG&R0f|m3Yz)KFH!&{EKp)iN-YBIMlLBW%7aX)gBBbl7J%-7Ey@Jl)ef48 z1iJw2cm)LoLzF=x1qEGn0c~^vV?9F?LsLr>Q_S=Xj8csdgE=764O4XuQOA2w&!5Eb zaT;~J44&pjaUHr32GEbtLq|bL7GKn6q*g$q6LriH-6w8tC>|vgz@V!WKv#d@T)wKT zkOozQX0JYKOzIlzn~-92Ze|5yjWIrtgB9X(1d5G@gq&nZz>%4`1^GoK3ZOCyZZJlg z1j*t&7ZofCD(H}gp|G2PC%{35!0iX;8zW=zy(zkeM#d((pc_;WERYaL1VsZl)<HTk zMv16UMj)rSXhQ=7q?N@e*(e&sLy|-(HqbPpmmtwl0VM6{1xhqnK-<U|NeyZN6Ak7f zNfYOJ)Y1aow|e;fiz1ETV-#7a7vT{{D?ei^IZ%9MWQu%{Em8pzZDeYS5`36N0dk&; zHqb*>j*{7;bq(~)k!6(?aAj=76ai=?9v(bo+k~3yqYcsBfs)-|*$I)s5G<G++)2@( zoUWk`6Gx~-uwZiPnvh9_TkOzgVih+iUZ9*Jc4h{KDvoGv-B|mW6zwWL(7-kLbRTe2 z27G$uEe=@dWA8?T)|^8YEz~f8t^<>103Q?qIhY-BCOhu63tL2CYZoLjiY)k%mlHv~ zN+p;}Kx^wD(Fpa3E=;D17v`B5y_giODsH6qNR>8BP9r+iH5SIH0joq2(zMsCQbE!Q z+1i4oEnOuGGbKjPJ|;yA&6Hd0(3V8eJkTXwT!>b5mA8hGX|#c^X>5&Aw1KV(_|mi3 z8bf=~QuEkqLmi`9O^p~m!iqGjjccoTKn-kIJG@E&WCnD(dbOdBN$o9AoWu6j6iG2N zFuVkHzpDg6yF3&;1Io-`dNr9K@s<u6Q)9BSsuC*B098%MYOp5*G4LQJ<Z7`R@KJ2d zj4907pv1s}I6nn6oB<jl1|9HQ3_c@+Ay%xGv4kOuaRE~e<3h$FrWA%S21bTLrWDW_ z8BE}v7Jiz{;C|OFuK3J?GP8KlB{)ToK{u*E4rMNS1sV$jjawmxZi_&d0bKwkEr^{} zIye&-Vz|}@v<tVQpvbO>3o=9sx}6fo5Dn<OR<QY?5sfN#E334$v^1+KAxOGJ4lr=^ zz=OET3ORa=YBi#*^mJo2(FE<SVhmA*G^<T&tGIm~ondkHi$gV1S2b5xH3c3cAg_YP zw?G)jy*r6FV3)gq>S^eB7wAO6qEt|;JQ1>;7B=(+TEqqI;DCCB;QlH2+<o{~f|7jb zS!tlt_)|e$6+KXg4Kc|HUY1a-pbIa(6m%8Ra!WuY=yqe!ZadJX8_>K$Y6@sY07yI7 zoZ^zA0uTdvep?CVXC>HbXOK5AJ24<pkU_BhUl@^(+@I7-&M&Bh&ToM<f-qb&dYcQw zBxv}A<b%3#8b}Q=kTKwf5NQ2sD%d3`^KD9omX?;fhDN%^hDu1<z*>-J*g)n)gWLlO z3~=abfOP687#is)7#l)Mc#tZTv3Jnvt>CE`9|i`7N)hl-C-~CF4u*wH3z$Hsa<ed$ zFlTcWxiK=-GBYw%iGZ%{s$nc)tzm9v1Wmhuj{QktsAaBWj$nY?W&xggV1gWOtjSgc zN@%w@U=ekT1>{P|awkR5FgEn0@m>%ce5w!V3g%l(WvQBsx0us%OAy)h7F%*zNqkz~ zb5M?j%sMbJiZBW=R_Wmna75;X7yvd>lc^{UG}IjrB0%MWCL=@uG@gBn7bV7SfNTVn zNeuivtW|ROZTlqxOMfA%9#*QpR;s~zs%a$UKVjHaHlPS2KmUQ!0&F`EjywobLi2ox z91g_f$r5lrz`B_eX@m#lbga1&qMfun2{H^vzJwYFF4v%IQjv0Hh>@|Csil>vrJkjw zC5c%SY$<X!1zpjkqhM+Y!IqYm1_lNMv#tjy>k6P|-Czd9bu-Xx3!W)0VIeZxvVya1 zQ8XxXfR`rX&Z|YSka`fDn?M-}a?t@OU;PE;8(2;i0OeF8{CNiyB4p%NL6qDIGUOe| zW_XTOB5Z4wIcTP+GBvTtE+(bgq*hbI-bxoFl$)Pdl3^E<5|aWKN=dAQ2x!`C+E?+w zh9N-(TU8rK50WwHW`Ox{1ENC|VnG@*@=HPX#-wOkfw;Mud8H+(5IZ!$B9N0e!6F*q zwkXJIO?!~yk}A8X8c-7x<VGud5UFWjC4lTIP>584+K{k2bE_?CHFS~N4koprMk0!k zp;7HE7Emt&USohta!{Cpr^Y~SdT5&rTw{Qz$Cwg9Hw(k7apVzEP_+%Y5=sFyDhWE^ zu^4jmR(Wa?_~2`ZcrkcsKB7#*UT-Ud%e4ZC7SQ?3P_yzt?S&lh*_n`)2cQxZghA&y zE70rAZm@+ZIwdKfLn1+|X%e$jL7oN;#cC*pxFD^G0xJdWfsco}up|X>*d)XNj8iNz zQZvd}FZ@tS1#Jb00r2<$S%$&^w<9!4;P#`mJwOi9gdCKppsb*4r=Sj6HKc%i*g4!K zh~vu<TPeWZ1X!~iGQk-Sc4<LsQBgB!u{!d72cX0Jz!fuufYicZ<*<<B6JuZ~1~p$9 zc(K&MC`yYSf+oEY6OBbdpn?o^9RhTou}TCykPkckBNZ~b53i(QYu~{s9Wn_F+OD~P z5!50g{+<#gkc&ZWf07LrgOsVDwh$yd5Cto!Q=tko*iVzOC<>xB5k%QTE_Im+YE8`o z5qm&HK8Pp-O(_e&OG@Ze#4T3vn9?mixCD3>q6mB$LI_A7cufI##d$C&5Zypx;UJbK z$Ux|D0KDfI0+Lw_T0Q_?fdE>caElk*-+?Oub(n6kfV$4NIAHTkMK?ibIkG{<)Qdtv zh9GWY2m>ud;6a`nDvAUN3B`jtr;z?0bS~+Za6Gs-iXvFF5@fh=Jk%MW?jclp5h!kN zfsBUFFWursnwlyy0reUaK+Z`5*~o+3CAcMk%mbCNw^%>}Hbs`8AhG}vDIlGxAOgIM zAG}Z>ym$kAON0R^0C~YvD2c_X1)$xcMWD;Ki@?`M+y==)k}2AJQ&AeoZ1D9G;ADXy zK)D9o4HgI0f1m|59Q6$BEKD4%9IPVDQp_UEN=$rAN=#f#BFrKz0?Z=J63l$ee2ij@ zM&PS@WSBu0_wa}^G4hD=fn=Bk7<u?v7%dp(m<5;x7;kaJ$LA(y=EcX~Vk=I~Nlh-f z#R9q?u!<>OrRX*!&pieWW3WT+J1s7n1PXdKa0yck+IWzgo0yl9=#AXKRR$dd0Xjh$ zq6a+B2Hr4}k`Fq?MFFfCd_)Mm?1I>>parQwf+K_VA|j)rA`!KQGWY_BoYZ3I@iL&Z z&Xs~)eO#SGlyty`Cnpw{6f1!4bOzN-N)Qtv*KmW1Nr+mQ4PeuC6dawLk*xsD{ehN9 zK-~@6h6FmHJ1+$~eh8XLQ-B%-J*^z>gJ5vzDL6XnI63J!J3~EES*({*nwW!Z34B>Q zI2aHU9WVoQ6r6Mv(Ddslgn){4BV=<j^U4x)GE>mpqo51AHlZ{pMIkLQGY9Uv2&n6@ z8IEcw=x(Z<)DqAMPT;7;VIah{s9GWJK?*#)dKKd0;y|HPp%9D_N>z{nOi;Wbj~;^t z`Qctd8Sq9Q-v*D@Bh3hcN9W;Ms}M~IWaE)WqpJ|7sK7>55#y`~7EBIqvL++=v=L1v zaE0Xtu36kdG#Nn`B0y@Z5Y5L$pfdaxcYJ&q<lNWz_*?vNPDo~MYJB`HuK4)G(vpn) zqWJitd7y%Wy*xEByC^lS2vlJfJq8sRpaP|+0mS+MDxbSSL>j1kI}KtvgNQ^BaR@|! z+IqLx<4ZD%QWH~(K&`%8+@9b$DA%H*{GwZ&5Sh%p^jrMN`8lAXATvL&ST8Xtxd?RR za1m(JPZ4McvFJD>149&deo;zlQEEy`W^&0b_W1b3oSgXhq935rfd}R<P|Kny0c5)x zNSr-4v7$J$Dz(TI<VessK@sT2o?Fbx8AU~)d%lancZGqf6Ub6dTaYe}qEwK1sVPO^ z^GgnZjI#$3{UB4KK|~CQ$OE~GEjO_uGq2<pTLt)L^`aM`pyQ5@Pb$sKDFGF8;H!FW zv8I9Yb`f~FB>1AVwV+Vk1tPA4h-o0=1c;apGJrp^I5{&jz7%xeJ*W)01r-3_j{y=W z0@rQe+7(=#nu4@~*6D%o62HX>ZkB;^FyuC&0+93NL2AIgFz{kkRS;JLL>vGSpo_?F zaTKMdXBL;F7C}~bg2r@;JVCO-AOpfdL?nm+Z6quz0kOba%Je`=z-tI4K`d}3B@L>x zDnLrW_alMEiHbm%pcUnTlz<xtpz6O!9mECg@hSpUW<?#KkQD-nfyR1^z*U_Nh^q}E zj6nowC2JAr+Myy)$FK-Az*_`5CA)|ZB&z@-KwXO>&<#~ZTS4Z5t4`2Hw4(hW?g0=1 zZd_=A6oU>kEjkYp(+6=u6*^=EBrk{y-U|m>lUS4j;(}{eI}qyy$ZvrlRse_y2N@6w zVu6}`MVTO07Kq3J5#S~e=w`1XZxGiDM1WSR6(xaKptjL1p7_+_<ivv1lz`H_<XikO zo=0khb4FqjLcl+{1T4TE4>^kk%;Aa$Z66Iv%u7!#0^cMh2nzm0kl~;kx{E-^b{By! zpaQq#5Y<2E(iHG@F-4%d9(-bKks3%Z=n&W<(2+Pr1|Y5>hyWdxQxpy|6tt+WC;`L* zw=_~gEYOxe@G{OKa}YNYL?9Y6H$dEe5D@?}>OY8O3nD<P5R0rpEO!tA>i!kQgIJCr z!X89`1}KW6KrB!ruc#bkfDMQXS|<f=uSRi0s$cMulqgP6ivrBN#R{GciQ<A(5}*Tu zqWBPO(7B2*InbRVQJmm960D3D&IGIC1YbR#8XV|TWDJVxT#zHc%}j7pwhY7t^>dLL z+u&9es6lm$!v?a0!VVPs#cvoH7+9EC7+Dxum_Wx1fi_2?Vjd<YMgc}XMj<99CLR!r zi3h}H1dV`zWCR!mSV3$)@X<pc5`;mE#JLzjEYN{OJd9k-LX14%>$kvmG0QNsfov3I zVFVp24jK6rU=m~E;1XcwVFZbSTp`9JU?CtXz$zdtz#+gTP|pB^>|9J7yc|3nTpY|` zD9z)5BnwkjCcq)UEx<3J#=^+PB;Y6@E+8aeD^Sm%AmAxb&%h<%E?_LcE+8c!Cm<rg zFCZi!A|NhMAmAh5FW@3jBj76_C7>XnCZH@JFTl>mDBvJaED$KbBETV_BOof^C?F*u zz@ft<%p=di$sxlb!@<Gh$)U`n%E8Vd3GzJ{GeOo2gEp2LFmXt5aB=W)@NwwyF!L~T z$Z`mCaB|plF!3m}fsSTk5-VU~7Go4+<YAOxlw*>J;w$1}<YH1_6l2t2<YJX!7Gf4- z6k=9jW?>d$7GPvzG+<O<1^ZeAbi5N6lK>OQ9xf2cq{Pf3#=*qK&cV#a&cVdS%)!LL JD8$Id1OS4w4g3HA literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bf11092057213f2193803202959b9df9312f0e4 GIT binary patch literal 24407 zcmZ?b<>g{vU|`Vf?~IvL%E0g##DQT)1_lNP1_p-WEItN?6ox2<6vh;$9L8LxC?-Y_ zn>mL$iaCWbg*k^MiUmxwMzMlvwkS3*%^t;`!V<-i!WzYy%9h2I!YIj*!j{bx#SQ1N zXER0dKzJ!^txS>(DID3XQM{=<MN?Aw(io%oQw7o(qXbih(io$JQ~9DqQbnW0QrWV^ zqa^a`QY9fOQl-+EKx$Iiv!v6QqJ&drqC`^p!0Kcd$fa;DWGp(BDv-j}%ort+=i$zf z!kxm?!jQs~D&Nc;rBKP2s+g+K%+Sop$PmtuC&$8&s+7$&fw72<kpTo@IwKkKxFQ%* z1yXoH=0q!`@TKs#FhnV*2&4$MFhr@iGo%Qm2)8h#2!qX4b!SKsNfB*fND)m{ZDx*A zb7x2qOA&8jND)tE&r)w@j?!>vNRdd9Y+*=|1gp?=XGoDsk#1o~kp`Qfm8zAh-OL!J z<Ia#GlOo%~kRqF^(aapBo2r>2mm-%UpQ6yrlB$`an4*-ToT8GV*vy)$nWCDal%kZP zmZA#gsi$b9D5q$qsDpW0DH<u-&CIEqDLP<1x+ywfalI7%6#W!~6g@D{5X{p{F$D9B zz$O@{7=d{vDH^G~6PSubQcUxhQp{4!!7i{!(MYibn`@O~onn(>3l>#KQAm*oi`u2w zrPza64k->$mSc(|lx2)!gA>?g&M8h{`&_`jaZPb)W=&N~QBKilW=d5{aZ7Or(;g|F zVA?CiJH@A&IaMviH^nc-7tHcc2}lV9vw~8BQ$oP3(3G&0a4;((B{C%n%!*ElNr?rs z;!@&M62Pp)l%$koFe@b`H6;zqN>9m1$po{qQnFIA!K|E=94IR{B^S!dOUX;g2g??u z6oOq>lu`_)OHxX~bXiJyN*P#1MM@=Dq$;I4r3Nfgn^Koj4`wx_G^R9xS<NXeDXm~u zTS|LM2bk5F(v{K;X7!}>ru2bX{V5YtCW2X$QYNQN0kfv2OiP:>M2{n0E%IuUm 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f37c62c8e053771e4685ede3794ae9f32a6ca58 GIT binary patch literal 742 zcmZ?b<>g{vU|`Vf?~J*?#K7<v#DQTB1_lNP1_p-W00stz6owSW9EM!RD8^i-D5hNI zC}u{66s8pB6qXd$6t)!h6pj?mbdD&N6s{=N6z(Xt6rL#d6y7L~6uv0V6#gi#6oDx2 z6v0$ZF@`9f6ro@SP2raydo-DE@h2t~=jW7`q{e6F7UUO|+~P>dEXyp;%+I^US5TCh zR}!CAnwMMx;&aBwmt>aYq{heJ;*O6mF3rtNEUJu;zr`LOUs{w25iLtC0_ly9zr__F zpIBOwkzW)ae~U9dJ~cNnGY6t3Co?%UuNY(uZ+v`menDkXW_m^mNLfK*a&}^RW?p)g zl5>7hszPZ=W=>{FW@@oQT7Hp2KxIirex3qEQEG9OVn#_xL9vy-etKp}Mro2>a(=FU zL1jUrK12n`7#2e_J&P($m;AiMoD_xNlG3!a5{1OP6ot$@kT+9G6LS=j^YcoIGLuS6 z@{5YA1X93C9g4w9^)mCTl$?TH6!MD{919YYGg1|NAdc5j2!r@k!AQ@bO3WGN3k4$s zLla#i14A<f)nY$QUQjTkm6ntirN+k>F)=VO6fuJc76t|eP`D-L<iy7pv4VuyKm<F8 z0L6R}Cx`_~9Yx$A77qgh!%BuC0T3HR{A$uKD9S8LEJ@WbODxh)%g;$kEh^SGGS)XX zGczl<D6upz&Wlg6Fv_(|u{1R?HZ3<WFfd3j&=1is$Sly!%quQQ%*oNUFv!i$$TrH+ zFHS8fEhx#)&nZS`#+Rk$rQ{bO0#rXfJ~1i3v?M-Wub}c4hfQvNN@-529mqSyA`A=+ VBFtQjT+A$tEQ~BnEKFdM5dcJi-f#c_ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..134a3d13aad6252e219959b72f337b2a9b523fa0 GIT binary patch literal 580 zcmZ?b<>g{vU|`Vf?~Gw&Vqka-;=nKm0|SEt0|P^G2m=E{3PTEG4nr<u6k{$^6jLs9 z6f+}33R4Pm4ofa;6l*S96k9HP6nid56h|&+6lX416jv^H6n8F96b~aq3QG!W3R?<$ z3P%cO3RenuI!6?53QsVDChtp-U7F0d_!E<g^K(i|QsXmo3-XIfZgHe!mSq-a=I7nw zD=5m$D~V4l%}XxH%+Gtt2y!mREw1?Z#L|+C{G#~yTfFh{$@vA9MVaXtCGqjMIOF3} za}zUj;^S{|$H(VnCa2~Vr$RWzrMbC@MU@amC7C5TAaVBi_|l?Gh=Q`zB9N`|@kQJW z3=Bn}z$xMZv3NlQ8;Ae}OA#lC#m>OM;HSw4a!XoiNoi4Pe0&iTNP-zeurM$%fZURp zlwVpBA72F44AN4BFac~n*e19ox7g$36LWIn<5w~i34+W45x*Ms3yLz!5=&C`%My$9 z)ADmtQj3c9jg0k;&CJZoElMoSi}T`BER1q3Q!GtQj7`f83=9m?3-m+u3o;9IGxLf| z5_58NEevwAGqR0x^ovtVN()Nz^K*)knek<*c`5lt`UQ!}*@@|ydFlG`@tJv<CGqik c1(mlrY;yBcN^?@}Kpraw`9_3EgN=(30DfbgNdN!< literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff7c6837887c152fd5383a5b722c89ba6e762b25 GIT binary patch literal 1032 zcmZ?b<>g{vU|`Vf?~I9IW?*;>;=nKy0|SEt0|P^G7y|=C3PTEG4nr<u6k{$^6jLs9 z6f+}8j46jDiY1jLi#3Hok|BjTn<<J7&SS}DiegV?FLFucNMnrR%wtRC0?{d~DQqna zQQRp^!3>)0FG03xGT-7)Oe)ULDJ@Bj&&(~zFDkjkk&;=KS)7@lcZ;u}C^N4lKCLt_ zxg;|`&+jG3VK12(7#NZnLAn_j7(g601_lOpkaN`-7#Q3c+8Npz)0k2iQ<z#fQkXgz zo0)5wN*ER})-a_or?6x)EMy60&}6OB=TcBmP;f3vO)N=ONK{BlEKXHO&PgmTRw&Ob z$xujC$W1Lt1PkbaRVG7i1XCbuL5yN41_p*yhA74qhA1Xvi=&uRn1dNKS*jF4ro|)7 zvdPI$PRuE`(}N2ovw%!uU|;~zAS?{>3l9SWLkD9GV+TVGb2G>&M!%H|nk=`NlXHr1 zvE(J@rrzQz$;d2@2RXd>7GsJg(=ApAn+0Ta5hz4{HRu-<WtJtDr0SO?7U`$u=cJ?- z73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W?6_+ID<mg%$ z<Ys4N8|CO1r<Rl!l;r2<6eBa^%Tn`F@{9Bf5|gtN(=+qZ_2ZNCa|;qn^a?6(vB$^f zrIyFX%YZxuia!R%Doui6q6gLGr^#}QBR(GF-T3%hT=DU_`6;D2sqyi*c;e#=OA~V- zGDZ9h3=Ci&YcdsqLavAxCQ!u3z`$^e6BH!i$drb;gM+aM6wtT$OHx7UF0rUG9;^Ur z%q^CZ%7Rp|!J5nv<G==k^gxv$*#x$P57k>DAe%t($-pkgTqFj{Y&;+@q?MMG7Ny3= z7lA^f2$YhFK&oyr7grYF;weil0;T=<%)GSxTg(BGMj*oY7ISe)(Jh|hlA_GK^mvfV tif?g&V;d|2HXZCLBm(Rv4jV{_*@3Jm1__BUaWL~S^0BZmaxk$m0{{xr2N(bV literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49f8c44decad90ccf22fe7aa96d6393dba56b4f3 GIT binary patch literal 2884 zcmZ?b<>g{vU|`Vf?~LhSWng#=;=nKq0|SEt0|P^`3j+f~3PTEG4nr<u6k{$^6jLs9 z6f+}(J3|Un3UdoX3Uew;GjkMcDr+-C6stQ!3QG!W3quMkSd=Z5t(hT;Erl(ZL6iL@ z$ZSpKTl|Sh#rZj<C8_b5xdr(}CAT<IGRrcHGxPIq@f8$h=9R>!mF6XvWaj53gLJ?! z6U;>+3=9mZ3{i|J3{gxej44bl3{lJ}%qc7_3{fm8tSM|Q3{k8p>?s^AAe%W;xLO#Z z*i*Pucv={uI8u01_*xjEI8*pj1X>uPxKadDgjyJ)xKo6K88k(1ad_sXW#(m;R3<Y* ztp(8_><kJEP@tqR1~X_f`4zD;FfgoS&}6*DQk<HTR>a1@zyKzGwdfZVWtJtDr0SO? z7U`$u=cJ?-73&)r>l>SynU!0VSeh5-#iv*p<yxj#nwl7!mKzut7^D~Ihv*k%7U*W? z6_+ID<mg%$<Ys4N8|CO1r<Rl!l;r2<6eBa^%Tn`F@{9Bf5|gtN(=+qZ_2Y|6ib|79 zN{dp9^$IF)am2?Lr4|&$$8&-l4hlO4#wtOW_w-=0DE?$-U|<0IlZSzUp@gA?v4)|U zu^HrFMn6raTPzug#TmC)K*nk^7O}%T4EA*q2Ll5G$WoA+_;`>3#aJwb$R>kj7#J8p zG`7HX1DmPI1h(WBYko;aY7tlnLV)dJi;vGKiI3+;@*Y2u_ds%_*;B-e#YZ4pQsd)= zaM_X?ACF=SS`gMS)-Yr-HZuh?Xo7=~E3+6J!FkE4w>abDlXDV_i{s;=9>wK=)WZ09 zQ5+5c$zgW@A2<$S4&Y&cI-y7a<V!(Nwub~SE?e_b<Krc8*b0(Eu@ze+hJYiBfZx(f z;^U=p*aDKHk}aw6@p8Cq0YxFm{h$mFqCps(3qZNO1R8FPw*>rB(-TWF%Ti&93`ZVd zkB`qwO^=UPM6yo+rbiDd>8Hs9$}D+_xvBB-x47ctbMsS5b3kmK`1r!o#2koB5h(K( zfihDOC_0NkiM<Gv7K?;Iu_yu}Kq;e09K?bbLEwM~=SXlV1<I+#AYB|x9L%T?EKl!J zwn&VDfdQr9K?!nb0b9kX3kx-{f3OEPID|Bjf?5(in#d{Yia_;Z5jQB4U@hptQKCb@ zRwBzfg4qNd_4-JbiDU61QN<l$t3V0Nh>%sF3<D~;K^X=_<1h1wDsaGw+LVCBv?=Sr zS;>Nc)kGC|D76;0VzmgAVXX;RMO3Lr*eX!5U`NO*P)vgI9w;V3GzeoBec(a@NA?31 zJdQ}#NMK2u;Ns9vlcxw&ofJueiYh4(L2=;*Do4~omg6YgK=OW??4a^BtrXNUijOY> zCD<ZRiY)>a@3+|Uld@8iOTb<PmrLNX28jT-H8^Y_<+B|~PccYHgjqnAjafhz00b-q A-2eap literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5e4f6f3db003811eca41f7fd41a02f647e731d6 GIT binary patch literal 8889 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13ddb97ee0c591898c118d1121b32cb478d1c4e4 GIT binary patch literal 3891 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..222592744d8e88778dd48304c4eded57165631b2 GIT binary patch literal 19810 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 XfqDi`0TT{RfqI5|24ODH{x4|&RGj0z literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..120488aa8065db2b8753d3b51ebe0d437eda99e0 GIT binary patch literal 511 zcmZ?b<>g{vU|`Vf?~GZ>$iVOz#DQUE1_lNP1_p*=BL)VB6owSW9EM!RD8^i-D5hNI zC}u{G7*h^Q6iX`00@f7fg^W>bDJ&_hEeuiYDNMl(nrtsYCTTL?;!jK}&d(_=NsZ6U zEyyn_xy6x^S(aIxnV)xyub?P1uOvRLG%vX%Ge6I-iY;0<UN2TVnGvLyfq?-;voJ6) zID;G_z`(#z!mxlbg|UWVA=3h;g$%(AnoNGb7<Dz7ZwbdIC+6knWhN))WLBld7p11B zR@`DPE={_{nv-9iTBON%izP2HH+3aL5y;QK>hueWGRqQ6QuWIci}cg-b5c@^iuH|* z^^MKU%*riFEX|Aa;!`Y)axGIVO-+nV%MA<+4AKkqL-Y$W3v@H{ic1o6a&#>Wa<enC zjdJvhQ%gz<O7in_ijkS|WvO{7`9=B#iOJcC>6v-y`lThAImLPfmA3>@oC|Up56F*9 zAdfQ@f!LZHx47ct(@IN9i&Ep`i$F3(phzhK1;{O?qSRaL$@#ejnK`LNYzzzxU_D^J fAragR3=Fq8Y;yBcN^?@}KpKldYDJhhn7Nn%H{FNp literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99dcf59506911d80b0b888cd747515f6881454f9 GIT binary patch literal 10577 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 C{)l)0 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py new file mode 100644 index 0000000..031332a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from setuptools.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py new file mode 100644 index 0000000..5b49341 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from setuptools.extern.pyparsing import Literal as L # noqa +from setuptools.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py new file mode 100644 index 0000000..4aa30ee --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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 absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/archive_util.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000..8143604 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""Utilities for extracting common archive formats""" + +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from distutils.errors import DistutilsError + +from pkg_resources import ensure_directory + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + + +def default_filter(src, dst): + """The default progress/filter callback; returns True for all files""" + return dst + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % filename) + + paths = { + filename: ('', extract_dir), + } + for base, dirs, files in os.walk(filename): + src, dst = paths[base] + for d in dirs: + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) + for f in files: + target = os.path.join(dst, f) + target = progress_filter(src + f, target) + if not target: + # skip non-files + continue + ensure_directory(target) + f = os.path.join(base, f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + with zipfile.ZipFile(filename) as z: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + with open(target, 'wb') as f: + f.write(data) + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal + # files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + # XXX Ugh + tarobj._extract_member(member, final_dst) + except tarfile.ExtractError: + # chown/chmod/mkfifo/mknode/makedev failed + pass + return True + + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/build_meta.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/build_meta.py new file mode 100644 index 0000000..70b7ab2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/build_meta.py @@ -0,0 +1,231 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils + +__all__ = ['get_requires_for_build_sdist', + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'build_sdist', + '__legacy__', + 'SetupRequirementsError'] + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + raise SetupRequirementsError(specifiers) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _to_str(s): + """ + Convert a filename to a string (on Python 2, explicitly + a byte string, not Unicode) as distutils checks for the + exact type str. + """ + if sys.version_info[0] == 2 and not isinstance(s, str): + # Assume it's Unicode, as that's what the PEP says + # should be provided. + return s.encode(sys.getfilesystemencoding()) + return s + + +def _get_immediate_subdirectories(a_dir): + return [name for name in os.listdir(a_dir) + if os.path.isdir(os.path.join(a_dir, name))] + + +def _file_with_extension(directory, extension): + matching = ( + f for f in os.listdir(directory) + if f.endswith(extension) + ) + file, = matching + return file + + +class _BuildMetaBackend(object): + + def _fix_config(self, config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + def _get_build_requires(self, config_settings, requirements): + config_settings = self._fix_config(config_settings) + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + self.run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + def run_setup(self, setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + f = getattr(tokenize, 'open', open)(__file__) + code = f.read().replace('\\r\\n', '\\n') + f.close() + exec(compile(code, __file__, 'exec'), locals()) + + def get_requires_for_build_wheel(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=['wheel']) + + def get_requires_for_build_sdist(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=[]) + + def prepare_metadata_for_build_wheel(self, metadata_directory, + config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', + _to_str(metadata_directory)] + self.run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if (len(dist_infos) == 0 and + len(_get_immediate_subdirectories(dist_info_directory)) == 1): + + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + def build_wheel(self, wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = self._fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + sys.argv = sys.argv[:1] + ['bdist_wheel'] + \ + config_settings["--global-option"] + self.run_setup() + if wheel_directory != 'dist': + shutil.rmtree(wheel_directory) + shutil.copytree('dist', wheel_directory) + + return _file_with_extension(wheel_directory, '.whl') + + def build_sdist(self, sdist_directory, config_settings=None): + config_settings = self._fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ + config_settings["--global-option"] + \ + ["--dist-dir", sdist_directory] + self.run_setup() + + return _file_with_extension(sdist_directory, '.tar.gz') + + +class _BuildMetaLegacyBackend(_BuildMetaBackend): + """Compatibility backend for setuptools + + This is a version of setuptools.build_meta that endeavors to maintain backwards + compatibility with pre-PEP 517 modes of invocation. It exists as a temporary + bridge between the old packaging mechanism and the new packaging mechanism, + and will eventually be removed. + """ + def run_setup(self, setup_script='setup.py'): + # In order to maintain compatibility with scripts assuming that + # the setup.py script is in a directory on the PYTHONPATH, inject + # '' into sys.path. (pypa/setuptools#1642) + sys_path = list(sys.path) # Save the original path + + script_dir = os.path.dirname(os.path.abspath(setup_script)) + if script_dir not in sys.path: + sys.path.insert(0, script_dir) + + try: + super(_BuildMetaLegacyBackend, + self).run_setup(setup_script=setup_script) + finally: + # While PEP 517 frontends should be calling each hook in a fresh + # subprocess according to the standard (and thus it should not be + # strictly necessary to restore the old sys.path), we'll restore + # the original path so that the path manipulation does not persist + # within the hook after run_setup is called. + sys.path[:] = sys_path + +# The primary backend +_BACKEND = _BuildMetaBackend() + +get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel +get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist +prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel +build_wheel = _BACKEND.build_wheel +build_sdist = _BACKEND.build_sdist + + +# The legacy backend +__legacy__ = _BuildMetaLegacyBackend() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/cli-32.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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 Wd~sli`QpG3^2GskkPu7?OalPivUv{x literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/cli-64.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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%0DUkH(*X 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/cli.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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 Wd~sli`QpG3^2GskkPu7?OalPivUv{x literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__init__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000..fe619e2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__init__.py @@ -0,0 +1,18 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', + 'dist_info', +] + +from distutils.command.bdist import bdist +import sys + +from setuptools.command import install_scripts + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81e5142866380e591cf4b9bbfc86797ea68475a2 GIT binary patch literal 752 zcmZ?b<>g{vU|`Vf?~DmzVqka-;=r&t0|SEt0|P^G6$1l93PTEG3R4Pm3QG!W3R?<$ z3P%cO3Renu3Qr1e3SSC;ia?5BicpGhib#rRidedM6hn%5ibM`$E>jc}BZw`T!yLt& zBAz0Z!;;Gy#mdN#BAv>V#g@%pRFoo<%9O>PB5lI}5?R2JBE682ks+EXnmI)>m_bwa z7HeWoW@7Oz&ZLyg;*$8(^mG`rs37+iXHscqPD*@gMaeA=2(zH_7JEu+S!zyx!7ZND z#Nx{M%)H`~#GIU49I5H)@tJvP`M20%LflYBd`@Q4Ew-ZklEjkKD30R9vef*7lHyye z#UMMQ*osq2@(W6Cv6Q41m)sJ7>46)^4-+X)F3JSy<0wi^&nzxUExN@EadmlS9!O0T zcWFURequ^|N`7+jEj9?}78k_f$vK%xQJf$P!H#?hiV01|TdZIc{4^Ph_!$@&qL@?D z(>0ljm>3ussssWmOEU8F6!cQl(-qP(b5b=qZ?VV6C+6hD$47~SOe!tO%qiAO&d<$F z%uCS&n^Yvqz`$^exwx`8N~k!sq_m(UKOdn6VhMj*eo<~>Njy|zaTFh_z%91Kf`Zh% zl$8uck_-$G;#awTK~ZK|Vo9ogSz?iXT7FJSYEiMik+Ht9nVDI+MTw<(abA3ig;B0$ zilwQEv1z%1fq_AKfqsa7L1uw2D0mWca&#>Wa<enCjdJu6ZbN25U8El$pP83g5+AQu rP<e~PCO1E&G$+*#6ez`F3=9lBj6957j9iRt%sh-7Ogu~=HV+d3OIPis literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce7e27a6ec360e51446fe6af0ecd22a0378f45d GIT binary patch literal 2420 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 F697WhUNHaw literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d146d7ddb851e94f88521dd120b9162aa034655d GIT binary patch literal 14208 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d8f2d9ecf7e491dc6ed4fd5ff28bcf9dd9ab059 GIT binary patch literal 1799 zcmZ?b<>g{vU|`Vf?~HlE%E0g##DQTJ1_lNP1_p*=4F(2=6owSW9EMy*CI&`^T&5^y zMh16=6s8pB7KRk&ROT$EX67iS6vki%O_rA+{eH<H5{8*zCMhs5Fr+d>F{UtpR7WvG zOo(DhVM$?aVTfW)VGCx^WWU9kl#*Fo5?@r1o0!JPz`&)TprGJimReMlnUbndl98&A zlA4xSnp2_xSErDanvqzRnO~$(lCO}G4_1_xpOceco|%_!#RWFOP){MKG*2NlJv}}% zFD)OWGBvNbv<PBkUSe*lLSkNuLRo52ab|v=LSj*>LP1e}L26M>r9yIIPI75ZVo7R> z9@s1+Jq5>{^2Ewwg`(0t1@+9l;*!Li9Cd}#;>^5s1zlYbm6NIqHA^?Oq9nB_FEJ;l zQa3j-FEKqeMWG}gY><M2LP}<FVp2{j$YI3_nRyC90lpxylA_F{(vr;lykdxz#(D}t zsRcQS$*Bq{iNzTT<(VZJ3Z;1|sYS)f`9-N9ouHtBTB(p%nwykbRIHGeU!;(fT2hi) z1Tq+AXL5dSL1IZ}Qf5wONhQSmWJYLofoNt11_ozP+)FVqFw`(CU`SzH$jHc0!kERh zfVqYN#7<!dX3%8vyTt(uP)(Lw+(o5%@yYqQxruoxw^;IvGSiDdaes@ss5DQL@fJ&Q zYEIfph9V9I28Lf1`UORqWr-!J`elhl`f2$&AfM<P8S5LHnVFSalvtV<=f$U380A`~ zSelv`o0c0G7#O4%=!fVRWESW`LtNLwAU8WB+bBoBIJKm-pd>#(rx=+Db&Ebcq39J< z7O^ofFz|ys2TI`#Ok7M=ya@TC(mZ%bfE0q%fI_1<2OJVv3=0?+GSo8GFfL$9VN79K z$W+Tz!kopjfE5%fwah8ZHH_j6oeU|=HB90Ros8`a?Tl$m;PlN=!|cM)%vj4@!@Pj4 zgK;5a3Y$1XElUbJNJlMe4f6u_8kQQ?g-nbLHO#>bnjC(=7<F$k##afbrlh82=B2`u zCftFbzy&!{7~~rR1_p+7h8l)g4Y2dTS#}}Q0&q43(<~{hAi9I0gK;6#M5aQPU<OUL zD*532(xT*411km9YEUMq)m5#ACZbxslEk7aO)LsZ^KujO(sNQ%;!%_ef@49ipi%)E zKMGZ*7(&G4jw&`)u)Zoa2(6%-hvYm=+cg<)u@^ydhbGf4COv~&EIFBZshUi;*g&+A zF_bm|r@bOhPy*z#$;m7(0p$cc8Bq9v1Cy&t7m*g?a}%>u<BJPYljGAeb5iwea`KZC zbBgWs5ISFia!ZvIEQT;#rl84jiw9Ji!E*C0?)20WSf~~8FfcF_v4RMY?YH>RY`n#q znU|7Uaf>Z8uQ;`+M3b$Eoq>Vj7CSW1qqvF+a-r;7EFgDAaY0nZ=j10x31YYg?0Ze7 zB2elt5&&5X3W*|71_lNYE*1k70gPOXJd8Yy9E==HJX{=1e2g57Jd9P6ID^GclkFBq zd^{-a#K+&_ijU9DPbtkwjgP;@6CYn#nwSHXVULeb$xn`t2j@SqonYr65n#uF0s@rj zia`mRgOi1cgAH7WXtG2}g95U&Br~U251O&{;I6vG4iy3`hJ-1ooIx}G7KaVQd3K<P KD+XC6#0&tVCHipy literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6086ff44d1456fee649f0b56ef7e2e31daa9a64 GIT binary patch literal 990 zcmZ?b<>g{vU|`Vf?~JKsVqka-;=nKq0|SEt0|P^`1_J{_3PTEG4nr;@69XedE>jdU zBZE6b3R4Pm3quNXDsvW7GjkME3S%&XCd*5Ze!pZ83B$}VljIl}7*ZLc7*iOcm{Qom z`Wd5`Q&>`1TNt8PQrLnSG&yeZCZ%K+m&BK6=4Iv;mlQEFFfb&8OaPe%auWzUgWRRS zz`#($kj1cov4*jRX(3ZBa}8q(V>VlnObSyCb39WGb1;J@b5$0X0u%(778K;9=BDPA zC={h;=4F;-Cgx;TrN$@c=jJBnr6`o-E0pIKWh*2W<(KBAz_n$RloVL$>nD|_7wZ*N zmSp7T>E#!t>t_}hm!=vSSQuKuRcbQbVh1@oF(>C1H<S^dlbPhF$$X0k<g230q|%bi z{JdKt*c?y<@|q^gEtcZcoU~i)P-oo|f~buzE=__872je`&P`d#P{hr^!0@X^zo00y zEU_e2zbvsxKP^8eCAFwn-^f_s*v!nV+@i$Nyf`mD#lk4pGR4x=#Mrdlz`(#Dy+A)i zzaX<f7wSx13xnM3jBKME{o>S;(t?uw{G4KBCe&tql*rL5s4QY*U|?VcMF%(~v9d98 zFmf=mF;*#|s)YCfHNcZWaSMu85Y55BzyOX`6;N_xtYL^}s1hh)%wk%=T*I)Ck&z)B zln9wX;t>of44|m>3vttAiQ<mWERHWK&CAQoOTWdEUzC|%#KgeBaErO9G*6SUh@F7} z5>DX2D&hfg`4|`&1VC;ES<1l3#>m7dz*HrO=Hk*kKTSq(`qN~+#StH$mzbLxAAgH0 zK0Y@;r8Eb`=82ClEKSUT$bf^Q2xK<IDp2G=SYS&*jsit+F^J$`<l+W9Q<Ei19+Wal tOEPnc^`N1whvJeVkSoE8i+Dk<N0<v{fegRJVFPiK9VjS^K~@Pd0|3P0_U8Zq literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..352b4708c9a5c6db4b206f92cf692c6c65689336 GIT binary patch literal 2469 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 Gg3JIC0k_fs literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2904917658a98de3d5c3e589fb10777b0981bf04 GIT binary patch literal 9723 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 CD3Ct@ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36bc74fa867536c4f8b836112623233d4fba8791 GIT binary patch literal 8599 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 TCMHG!Mm{DHR*`y!NG>4&@~Mb% literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68a0a6a4598ddfbe6b53c18e922ff6dafa70cd9a GIT binary patch literal 6480 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 U!NkMF0Uj9PU}9kwsb??)0NMq@6951J literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79ba72c49322cfbccced5c284e51c9e05ec87a1a GIT binary patch literal 1395 zcmZ?b<>g{vU|`Vf?~FOX%)sy%#DQTJ1_lNP1_p*=3kC*;6ox2<6vh;$9L6Zd6vh<h z9Hw06C}u{G7)uUIE^8DkBZE6b3Tp~m3quN9DswY)6k7^YFoPz0l?#`1QEFmIszRbd zN@j6Md}dx+zCuc7QEGBYeo-ZtW3fU?YFcJqYKlT;o<d1RszP~2YHE%`aY1TwW?E)) zVo7Fx9@k5dtNb(>Z?QY)=jJBnrD!tVV$R7=PX>v@FcZwhdJGH<sSHt!DGX6eDU4Cf zDNN~%Q7kFUDJ(4vQLGSGMzN)^r*O0|M6suE1~X`K-QtA1u1Yo;=3+gNpf0MDHJPh8 zQ`6IRlM;(lZErEAR{6kvqmZ1RSCW{SmzkHYpa)WeqBAqKSV1EtH7&6;r^HI3B)>o* zKMm~T;{4L0<Wz-{qSRE)WJaiWKs3ll&Y(B|MN<kx4MRLb3PUi1CL<^)I8xKo<3Wzl zWW2>voSKuilA(x$fq~&yg?>R%W?5oMs(x8wk$zf!PD*M~vA&V9zOk8^S-C}trFn5) ze2Rrpu4Rg)sfn>^xq*R!L3)9Hh<-t4fo^7AaY<rMj;@74ZgxhtQI39bYDsB9Nq&A# zF)}k55)b;I00PIUUP0w8q0GF@lFY=M%&OG*`~pzS6^nwL5Ap{CW0ed-F{VNkkApl9 z_BbdNLcI+3oF-!tI|Bp6qhNs|P6h^sTLNjBc_`LOAXzJguohhz+)|J|AcMh{<}olZ z)G#byNMT&aSj$+$ki}TT7|&S4xPWOP10zEX;{s*~oyC&EP{NwR)Xd1u(8?sqkism^ zP|H-pwtzi_WdTPCXBO82?i!|rj3CGeF_Cp4V=Z$H^8%h4#w?Z^riDz5kQin2y9JI< zP=cxAgr}V<E<_5f;sqy5P})+ju2sLqodot5IJ;=_-V#kuEs2NuFC`utKSgYy(BcM# z5pz*#UJ(zNm6MuR#0+Awfb6@)mX=?Xn^<y-DZls@OF?2u#x3^5q+$>w3gjpwkUg3# zkbnmn5XB1;0mpiLN@h_JFUSs1(nG{Z5kCV1gES}-1VHJTk&BT73?&#Pn7A0L5C-TK zmFD?ra@^vGkIzfYO^uJg#T6f)o1ape17h>U#}}3+=0Ih*Q&NkQi!#9p>lROGacU7P zl@)<9ND;`JV2dH{Kywi&ib1X~2C3y>Vqs=u;b7)qE&_>bvfpBlk59=@j*l-A1_cZs z$cLpRnK{LJ$@xX8MW7T6DI&mv;Lro>#Aekk4jYIM>_BE0gWSQw#KFYF$ioZ(>&|Q{ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce2bcc8ef9bc9f18ad07bca394194ccb50f63dda GIT binary patch literal 64851 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 X3T%vQ%p3w79DFPsY#dx%;(Q_ie^c$X literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3915c56960d87c2cdfa7d3fb784e2432950796da GIT binary patch literal 21697 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e28b76fc1d5312178e84f586be79d024e8f2be8e GIT binary patch literal 4027 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 J%tAQ=i~x7ZFdqN_ literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c72450388882b68532db6b57f13a5431d14fde0b GIT binary patch literal 2428 zcmZ?b<>g{vU|`Vf?~Iwv!NBks#DQT}1_lNP1_p-W7zPH06owSW9EM!RD8^i-C?-Y_ zpDBkqiaCWLg*k^Mmo<tNEXI<<lFJsw24=J7u;+3_ae&!OIh;|P?hGkxDeNr_DeS3i zSzM{C%`8#eDNMl(nj9}dc4{)+V$R7=zr~S~SrlJdl9}VD$#{$1IX^cyF)u}v@fKHJ zVs2`2L1J=hu_og!zS6vc#N_Pw#G>Sk%(B#EkO?r%1ar9)0|P@ULlk2QLljdAV-#}= zV-!mYQ#xZ5YYKA;OAA93TMBCmTMI)JdkT9BM+-v~M+#>OR|`WFX9{-;PYXj7R|;=1 zgC^fCfy}((lEj>x_|)|D_{_Yt{3<<9h=@XBo`PO#db%!1R3Rm^C^fkxzo=3nEx$;i zBqLP;<jBPIR88h89;g|*DVasKw-{5Z#1X1X@)e-63MKi;j8Kn&Xpmo=L9qaes1$}8 zhIob)hF}IwMo{Q*Lp8;xWEN>M-eM_E%}HCyP{hr^!0@YHzo00yEU_e2zbvsxKP^8e zCAFwn-^f_s*v!nV+@i$Nyf`mD#lk4pGR4x=#Mrdlz`(#Dy+A)izaX<f7izGsg+Xq1 zMz&FoesO9^X+cSTeoiqmGZ_*)`cUQY;L$6nyd{*GmsygTn3GwR8lPWKl9``ZEDZ7p z$VUu}RmvE8FxA6Df|-GVfsKKI0UQ!x3=9l43=0@i7*m)QGBJYKj48|u8EY9!m==Ii zBts2j7E29d7VAQm1uP30Qdq<pYME*nv)F1F;@L|$vN#uT)i7jn*Dx()s$q!dNe6{0 zFE~_L{cgd-G$%7jlc|W4fq?-`+~R=8JtsWEHTiCd7N?fPm*%CUre)@(roeo9OEf*T zBt9)O5A6SxcxXV~;w{Kdk1t9s&Mz%WPA$I0<C0liQk0og3JM;G4WLvW#SOBnEVZaO zGe570pMinl78^v%EvEe9TPy{MB^kF^vhp+YAWmZ|Ni0fFExE;>Us_U7T2idZTm(uk zQEaK1@yWR<w>Xj#i&H@cgOdh?-~pK`0COSC-D02^5(1?^Mm9z^MlMDcMj=KvMh-?H z#wtaO7(>?$k1tTlWrxMr9C&;!WMpJ0Va#G$z+A(S#j=pG$O_D3h46~4O4zd4LF^ia zERGbWUM5C{JPoi4PLSwA#-gMeh6P+Dj9J_uei~y6*c@?&h0Kf$AU(w;B|HmwL2@9Q zKx%6kviMS1Qb0EFgT&LA#GtAd2rOg(l}*76nrwdHFa{MjDMgj>MWuOFoI$C%`DK}T z=?X=l+*BptoL^80;;I%al;kU@7HbOL;w~!9gGFo+DBz03L1D_8S)7ttR3r&vvt<_N zWaecTfzt0S?jn$xsqrO6si{S>VCmF~%;J*bTkNS7smY}!skhil^T6ssF>p&DHLtj| zC>4~sA%)5<j^zA;O0afO1_p*GAy|Zfq83&%f@2=+Xb1t0XXc{PJVj8{ih!e*i&2JA zgprR?ijj?xhmnO*f~iUbW)>*rfyy$yqS8E+_yol%IRAk%VhuwUtQ0De0@WalSncHo z<pOA;)C1WM&HOSLwjn8m+X_<5!oa`)3cX?l1_p+9hBQV{u5aO}Wh`OnV8~+ZV8~*s zVQglG#w4>}GDs81lORo?DhyoaxG^v=RH&sex-i7b)iQw!j~b?hjKvBmOf^j63^fed zY(;FK0-%sB9Bk|YrW!_25-MR{zyeBSHH_dS#u&_?$>OKURK==ST$ZO_#o`<mtpAHq zA4~FJy~R~rl2}wyT%K8y0S=;DY>5R0sd*_yAQ#?ZO-W5EP1j_;#avvJe2Y1yxa1Z~ zadu{bCUQW6<Bq*JJ2N*owa6G0ejpJB7A{6HMh-?EMn1+WEsT(ar4c=woc!d(oMJmY zr~#VHMWCoF0;L^r^3-I4M4ADpi~}WenB^c_iqsew7z{ynf}((diHEyN5~p2$n%uWI z;^RT-Fh2ekSA2YKeoARhYJB`Hp7{8}(!?C7410WhN`7*D{4MU3)Z*l#OmMYui>I_W zwFp)M74d>xBLgDTL4*c~0J#N{oI%cnu)vN46*8cru2_J9fq{dOg^7ikjhTa)gPVhw zgSiMKtI2bVGbOXQ1k|D^28TU3H-a<lEiOd0Rs`~95h%q(i6cbypzRBAg9H+M;JnER lt^QMsz?MK<gzC0i95#?pumk0sVvutM7&(}D7(tMO82}{Dal8Nk literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfb8f6a84f94dac943197b6a5a66b548a47994c7 GIT binary patch literal 4104 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8172e09f3604350f32a1ffd83936eac1339cefad GIT binary patch literal 2307 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 bw>WGd{<8y>u*IP4z{4oS$ic|LB*F{;jUs>b literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5fdaa7d58a2f645cf810119c347eefc3ba17ec3 GIT binary patch literal 4640 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad0aad394ea37924160b3d545f82eb061826dd92 GIT binary patch literal 797 zcmZ?b<>g{vU|`Vf?~D;+Vqka-;=nKq0|SEt0|P^`2?GN|3PTEG4nr<u6eA;u&6LBG z%gn^U$dJnt#mdOw&XB^K!qUQ!!jj6G#nQ|i#gf7l%%I8o5@ePp<1OZ#{B*x$5C?{t zV1~;uFfgPtL@}l?L@}i@XR&0lMzN+arZBZIM6snX2Qz50+~O!oP0uVYNi9ldglY%T zAcs4HoM*tmz)&Ss!?1uMg>fMxBSQ&e7SjUe8U_$MoFRpwhG79q3R4Md7TZE5MurH6 z6oz01O=iDa9I5H)@tJvP`Bl;3jzNB&e(qKZK~S4A^U@VEixpB*3yM;c6H8K4bQDU9 zQx!_eGxJgvO7ay-3v%)kQxr1uic3-xQxr5ZN=gcft@QN^Dho38@{7{-3-rNi^))rw zZ*dou=EW!H=jJBnrQBl4FUm|WVrF1qxW!ylns<vMF)uH_G%q=|2oxl@SU^tEWW2>v zoSKuilA(y3fq~&yxqd-WW?5oMs(x8wk$zf!PD*M~vA&V9zOk8^S-C}trFn5)e2Rrp zu4Rg)sfn>^xq*R!L3)9Hh<-t4fiB3Ai8(pC76!T58QDfT`o*awr3EGV`8mbNOsE6( zVS%kzP+7#zz`(!(3S%Bnz%w#2aWM)ou`n_*Rq?=;6_w`sX|mtqh>y=p%uS7tzr__F zpPQdjnge3<#K#wwCgwn7ir5$!7$9C}kB?8uPmYfV+W__?5&^Odtc(?8H7FT!Fmf<~ zMKsxNai(Mzmz0)d<`jcNEJ_N_*MoXN59YR8>`)P~UWoOe07bLw7KaVQ!FHf@RSdF_ Ihf#<b0GwFIdjJ3c literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4962b42ac991205d35674a7fb4335a2740bf5a09 GIT binary patch literal 2546 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..763a109bf4f38d06653c2b0e930ddfbe5fd78d7f GIT binary patch literal 941 zcmZ?b<>g{vU|`Vf?~Iwm#K7<v#DQTJ1_lNP1_p*=6$S=|6owSW9EM!RD8^i-C?-Y* zcZL+E6y_F&6y{W>X67j76qaBHP1ctny_!t7xKmRyOX8FB^U^ZYZ*k`rlw{`T#U~{e zrzV3Gz%Ucc0vQGdhE#?q#uSDqrWD2~<`kwVmK5d`mKKI6))dxY22HkG9L0%csrdyZ z#Z}6|iDjt@$@#gtiFqlyIhlE>3J?p56-x3I5*5-ib5g6!LCO`1OA88eGE-BK6%?nI zloseEr==_87b)bIWTX};K->w|n9K-u96JL80|+~V0-%6_fuV*Wi=mb=lcAQWBA|vb zi_wK4)~%MghB<{Xo2f{lP^iMJhH(K?4f8_A1<VT>To__iVwh@KVwh@KYuRd8Q<$=u ziVSMlYM2(V)G%i<EM%%-v0*4Q2xll13TG%`tzpPwt6{2P$YO71W@JcV2xib^_A3I# zKot+vs|p~mYI5A-Ny#iODauSL1qJFYeyD6bGz@O>r>B-cIq@l($tAZ~GfPr)i*Ioi zr<SCorX`l<loWvi{uT!)pz;!PQ*W`S6jjC-mF8)(-(o3F%}Kk(0<z*3M{#ONNoHPp z@h#@$+>~3)`2{7nn2U>&Z!wo8=B#8W5@ujv_*Jf7P?TAgSdyw=mRO{pmY<W7T2!oW zWUOy&W@c7yQDSLcoEM*BVU%l`Vrgn(Y+7z$U|^75pdX@NkXfLcnO9trn3JPxVUU}h zk!_Tt500IZ{QR6^WG2*)`k+V!r2)Ny%3I7urFop7$Pog?7$X}a3lk3$2O|@c3?m1l z1XC3cTyarpo*yU$#m9qu8y|m*D?UCqKczG$H9r0pPkek~X<`mkhCMz$B|kYn{uXyi zYH@N=COF|1i83%id<*t6gb)FVf#L^*i`f_$7&sVNm{^#=aptGV5+#Z7iXPPcdc~<F j`2~>RFJgun05J~~m=G4o<Xapz5Et5k(ql0wz66*7JRt+3 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492681efc12392b57befc419b04a73b67f3ccba1 GIT binary patch literal 6799 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e591233f772e1de0a12d12f26ee4304f169842e GIT binary patch literal 4539 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 P@G$W(a|v^43#bDCK5)(; literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec42319d6c1f9edba5f760b228c0324730f98316 GIT binary patch literal 8134 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 LOf1X-ntWUUMJz7; literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfda7fc490b217e03d623834b1800963885e3c8f GIT binary patch literal 5205 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 J!z2KrnE}MF#tr}g literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb185afc0ea149c4ec3c963a1debe7f68d9d4421 GIT binary patch literal 6150 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/alias.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000..4532b1c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +from distutils.errors import DistutilsOptionError + +from setuptools.extern.six.moves import map + +from setuptools.command.setopt import edit_config, option_base, config_file + + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: + return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args) == 1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote, self.args[1:])) + + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source + name + ' ' + command diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000..9f8df91 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,502 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +from distutils.errors import DistutilsSetupError +from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import re +import textwrap +import marshal + +from setuptools.extern import six + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.extension import Library +from setuptools import Command + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + + def _get_purelib(): + return get_python_lib(False) + + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + + +def sorted_walk(dir): + """Do os.walk in a reproducible way, + independent of indeterministic filesystem readdir order + """ + for base, dirs, files in os.walk(dir): + dirs.sort() + files.sort() + yield base, dirs, files + + +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + + +class bdist_egg(Command): + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + def initialize_options(self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files, [] + + for item in old: + if isinstance(item, tuple) and len(item) == 2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized == site_packages or normalized.startswith( + site_packages + os.sep + ): + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s", self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + def get_outputs(self): + return [self.egg_output] + + def call_command(self, cmdname, **kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s", self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root + instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s", ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep, '/') + + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root, 'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s", script_dir) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s", native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s", native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base, dirs, files in walk_egg(self.bdist_dir): + for name in files: + path = os.path.join(base, name) + + if name.endswith('.py'): + log.debug("Deleting %s", path) + os.unlink(path) + + if base.endswith('__pycache__'): + path_old = path + + pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' + m = re.match(pattern, name) + path_new = os.path.join( + base, os.pardir, m.group('name') + '.pyc') + log.info( + "Renaming file from [%s] to [%s]" + % (path_old, path_new)) + try: + os.remove(path_new) + except OSError: + pass + os.rename(path_old, path_new) + + def zip_safe(self): + safe = getattr(self.distribution, 'zip_safe', None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info, '') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir: ''} + for base, dirs, files in sorted_walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base] + filename) + for filename in dirs: + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext, Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir, filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = sorted_walk(egg_dir) + base, dirs, files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base, dirs, files + for bdf in walker: + yield bdf + + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): + return flag + if not can_scan(): + return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag, fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base, name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] + if six.PY2: + skip = 8 # skip magic & date + elif sys.version_info < (3, 7): + skip = 12 # skip magic & date & file size + else: + skip = 16 # skip magic & reserved? & date & file size + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + return safe + + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: + yield name + for const in code.co_consts: + if isinstance(const, six.string_types): + yield const + elif isinstance(const, CodeType): + for name in iter_symbols(const): + yield name + + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, + mode='w'): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".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 DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir) + 1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'", p) + + compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in sorted_walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in sorted_walk(base_dir): + visit(None, dirname, files) + return zip_filename diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000..7073092 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +import distutils.command.bdist_rpm as orig + + +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: + + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ + + def run(self): + # ensure distro name is up-to-date + self.run_command('egg_info') + + orig.bdist_rpm.run(self) + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23, line24) + for line in spec + ] + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) + return spec diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000..073de97 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +import distutils.command.bdist_wininst as orig + + +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None + return cmd + + def run(self): + self._is_running = True + try: + orig.bdist_wininst.run(self) + finally: + self._is_running = False diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py new file mode 100644 index 0000000..09caff6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py @@ -0,0 +1,98 @@ +import distutils.command.build_clib as orig +from distutils.errors import DistutilsSetupError +from distutils import log +from setuptools.dep_util import newer_pairwise_group + + +class build_clib(orig.build_clib): + """ + Override the default build_clib behaviour to do the following: + + 1. Implement a rudimentary timestamp-based dependency system + so 'compile()' doesn't run every time. + 2. Add more keys to the 'build_info' dictionary: + * obj_deps - specify dependencies for each object compiled. + this should be a dictionary mapping a key + with the source filename to a list of + dependencies. Use an empty string for global + dependencies. + * cflags - specify a list of additional flags to pass to + the compiler. + """ + + def build_libraries(self, libraries): + for (lib_name, build_info) in libraries: + sources = build_info.get('sources') + if sources is None or not isinstance(sources, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % lib_name) + sources = list(sources) + + log.info("building '%s' library", lib_name) + + # Make sure everything is the correct type. + # obj_deps should be a dictionary of keys as sources + # and a list/tuple of files that are its dependencies. + obj_deps = build_info.get('obj_deps', dict()) + if not isinstance(obj_deps, dict): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + dependencies = [] + + # Get the global dependencies that are specified by the '' key. + # These will go into every source's dependency list. + global_deps = obj_deps.get('', list()) + if not isinstance(global_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + + # Build the list to be used by newer_pairwise_group + # each source will be auto-added to its dependencies. + for source in sources: + src_deps = [source] + src_deps.extend(global_deps) + extra_deps = obj_deps.get(source, list()) + if not isinstance(extra_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + src_deps.extend(extra_deps) + dependencies.append(src_deps) + + expected_objects = self.compiler.object_filenames( + sources, + output_dir=self.build_temp + ) + + if newer_pairwise_group(dependencies, expected_objects) != ([], []): + # First, compile the source code to object files in the library + # directory. (This should probably change to putting object + # files in a temporary build directory.) + macros = build_info.get('macros') + include_dirs = build_info.get('include_dirs') + cflags = build_info.get('cflags') + objects = self.compiler.compile( + sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=include_dirs, + extra_postargs=cflags, + debug=self.debug + ) + + # Now "link" the object files together into a static library. + # (On Unix at least, this isn't really linking -- it just + # builds an archive. Whatever.) + self.compiler.create_static_lib( + expected_objects, + lib_name, + output_dir=self.build_clib, + debug=self.debug + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000..60a8a32 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,321 @@ +import os +import sys +import itertools +import imp +from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler, get_config_var +from distutils.errors import DistutilsError +from distutils import log + +from setuptools.extension import Library +from setuptools.extern import six + +try: + # Attempt to use Cython for building extensions, if available + from Cython.Distutils.build_ext import build_ext as _build_ext + # Additionally, assert that the compiler module will load + # also. Ref #1229. + __import__('Cython.Compiler.Main') +except ImportError: + _build_ext = _du_build_ext + +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') + except ImportError: + pass + +if_dl = lambda s: s if have_rtld else '' + + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self, fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = get_config_var('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() + if isinstance(ext, Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn, libtype) + elif use_stubs and ext._links_to_dynamic: + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext, Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + _customize_compiler_for_shlib(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name, value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + def get_export_symbols(self, ext): + if isinstance(ext, Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self, ext) + + def build_extension(self, ext): + ext._convert_pyx_sources_to_lang() + _compiler = self.compiler + try: + if isinstance(ext, Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self, ext) + if ext._needs_stub: + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) + + def get_outputs(self): + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file + " already exists! Please delete.") + if not self.dry_run: + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) + f.close() + if compile: + from distutils.util import byte_compile + + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name == 'nt': + # Build shared libraries + # + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_py.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000..b0314fd --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig +import os +import fnmatch +import textwrap +import io +import distutils.errors +import itertools + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse + +try: + from setuptools.lib2to3_ex import Mixin2to3 +except ImportError: + + class Mixin2to3: + def run_2to3(self, files, doctests=True): + "do nothing" + + +class build_py(orig.build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + + def finalize_options(self): + orig.build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self, attr): + "lazily compute data files" + if attr == 'data_files': + self.data_files = self._get_data_files() + return self.data_files + return orig.build_py.__getattr__(self, attr) + + def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + return list(map(self._get_pkg_data_files, self.packages or ())) + + def _get_pkg_data_files(self, package): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Strip directory from globbed filenames + filenames = [ + os.path.relpath(file, src_dir) + for file in self.find_data_files(package, src_dir) + ] + return package, src_dir, build_dir, filenames + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if (copied and + srcfile in self.distribution.convert_2to3_doctests): + self.__doctests_2to3.append(outf) + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d, f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d != prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) + + def get_data_files(self): + pass # Lazily compute data files in _get_data_files() function. + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = orig.build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg == package or pkg.startswith(package + '.'): + break + else: + return init_py + + with io.open(init_py, 'rb') as f: + contents = f.read() + if b'declare_namespace' not in contents: + raise distutils.errors.DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) + ) + return init_py + + def initialize_options(self): + self.packages_checked = {} + orig.build_py.initialize_options(self) + + def get_package_dir(self, package): + res = orig.build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, + ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns + ) + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( + fn + for fn in files + if fn not in bad + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + + msg = textwrap.dedent(""" + Error: setup script specifies an absolute path: + + %s + + setup() arguments must *always* be /-separated paths relative to the + setup.py directory, *never* absolute paths. + """).lstrip() % path + raise DistutilsSetupError(msg) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/develop.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000..009e4f9 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/develop.py @@ -0,0 +1,221 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os +import glob +import io + +from setuptools.extern import six + +import pkg_resources +from setuptools.command.easy_install import easy_install +from setuptools import namespaces +import setuptools + +__metaclass__ = type + + +class develop(namespaces.DevelopInstaller, easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + self.uninstall_namespaces() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) + self.args = [ei.egg_name] + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + egg_link_fn = ei.egg_name + '.egg-link' + self.egg_link = os.path.join(self.install_dir, egg_link_fn) + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = pkg_resources.normalize_path(self.egg_base) + egg_path = pkg_resources.normalize_path( + os.path.join(self.install_dir, self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = pkg_resources.Distribution( + target, + pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = pkg_resources.normalize_path( + os.path.join(install_dir, egg_path, path_to_setup) + ) + if resolved != pkg_resources.normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", resolved, + pkg_resources.normalize_path(os.curdir)) + return path_to_setup + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = pkg_resources.PathMetadata( + build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement: + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> from pkg_resources import Distribution + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py new file mode 100644 index 0000000..c45258f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,36 @@ +""" +Create a dist_info directory +As defined in the wheel specification +""" + +import os + +from distutils.core import Command +from distutils import log + + +class dist_info(Command): + + description = 'create a .dist-info directory' + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ] + + def initialize_options(self): + self.egg_base = None + + def finalize_options(self): + pass + + def run(self): + egg_info = self.get_finalized_command('egg_info') + egg_info.egg_base = self.egg_base + egg_info.finalize_options() + egg_info.run() + dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' + log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) + + bdist_wheel = self.get_finalized_command('bdist_wheel') + bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py new file mode 100644 index 0000000..06c9827 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2342 @@ +#!/usr/bin/env python +""" +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://setuptools.readthedocs.io/en/latest/easy_install.html + +""" + +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re +from distutils.spawn import find_executable +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import textwrap +import warnings +import site +import struct +import contextlib +import subprocess +import shlex +import io + + +from sysconfig import get_config_vars, get_path + +from setuptools import SetuptoolsDeprecationWarning + +from setuptools.extern import six +from setuptools.extern.six.moves import configparser, map + +from setuptools import Command +from setuptools.sandbox import run_setup +from setuptools.py27compat import rmtree_safe +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) +from setuptools.command import bdist_egg, egg_info +from setuptools.wheel import Wheel +from pkg_resources import ( + yield_lines, normalize_path, resource_string, ensure_directory, + get_distribution, find_distributions, Environment, Requirement, + Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, + VersionConflict, DEVELOP_DIST, +) +import pkg_resources.py31compat + +__metaclass__ = type + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + + +def is_64bit(): + return struct.calcsize("P") == 8 + + +def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ + both_exist = os.path.exists(p1) and os.path.exists(p2) + use_samefile = hasattr(os.path, 'samefile') and both_exist + if use_samefile: + return os.path.samefile(p1, p2) + norm_p1 = os.path.normpath(os.path.normcase(p1)) + norm_p2 = os.path.normpath(os.path.normcase(p2)) + return norm_p1 == norm_p2 + + +if six.PY2: + + def _to_bytes(s): + return s + + def isascii(s): + try: + six.text_type(s, 'ascii') + return True + except UnicodeError: + return False +else: + + def _to_bytes(s): + return s.encode('utf8') + + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + + +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=', 'S', "list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', + "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'editable', + 'no-deps', 'local-snapshots-ok', 'version' + ] + + if site.ENABLE_USER_SITE: + help_msg = "install in user site-package '%s'" % site.USER_SITE + user_options.append(('user', None, help_msg)) + boolean_options.append('user') + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + # the --user option seems to be an opt-in one, + # so the default should be False. + self.user = 0 + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if site.ENABLE_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + extant_blockers = ( + filename for filename in blockers + if os.path.exists(filename) or os.path.islink(filename) + ) + list(map(self._delete_path, extant_blockers)) + + def _delete_path(self, path): + log.info("Deleting %s", path) + if self.dry_run: + return + + is_tree = os.path.isdir(path) and not os.path.islink(path) + remover = rmtree if is_tree else os.unlink + remover(path) + + @staticmethod + def _render_version(): + """ + Render the Setuptools version and installation details, then exit. + """ + ver = sys.version[:3] + dist = get_distribution('setuptools') + tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' + print(tmpl.format(**locals())) + raise SystemExit() + + def finalize_options(self): + self.version and self._render_version() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = { + 'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if site.ENABLE_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + self._fix_install_dir_for_user_site() + + self.expand_basedirs() + self.expand_dirs() + + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d + " (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: + self.check_site_dir() + self.index_url = self.index_url or "https://pypi.org/simple/" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path=self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path + sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, six.string_types): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path + sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): + raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + def _fix_install_dir_for_user_site(self): + """ + Fix the install_dir if "--user" was used. + """ + if not self.user or not site.ENABLE_USER_SITE: + return + + self.create_home_path() + if self.install_userbase is None: + msg = "User base directory is not specified" + raise DistutilsPlatformError(msg) + self.install_base = self.install_platbase = self.install_userbase + scheme_name = os.name.replace('posix', 'unix') + '_user' + self.select_scheme(scheme_name) + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = self.outputs + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in range(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except Exception: + pid = random.randint(0, sys.maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + pass + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir, 'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname() + '.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() + os.unlink(testfile) + except (OSError, IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + if instdir not in map(normalize_path, _pythonpath()): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://setuptools.readthedocs.io/en/latest/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + + def cant_write_to_target(self): + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += '\n' + self.__not_exists_id + else: + msg += '\n' + self.__access_msg + raise DistutilsError(msg) + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' + ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' + try: + if ok_exists: + os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + pkg_resources.py31compat.makedirs(dirname, exist_ok=True) + f = open(pth_file, 'w') + except (OSError, IOError): + self.cant_write_to_target() + else: + try: + f.write(tmpl.format(**locals())) + f.close() + f = None + executable = sys.executable + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + + spawn([executable, '-E', '-c', 'pass'], 0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: + f.close() + if os.path.exists(ok_file): + os.unlink(ok_file) + if os.path.exists(pth_file): + os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/' + script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base, filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self, spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=u"easy_install-") + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + + def easy_install(self, spec, deps=False): + if not self.editable: + self.install_site_py() + + with self._tmpdir() as tmpdir: + if not isinstance(spec, Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg += " (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence == DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location == download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.egg_distribution(download)] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = Requirement(str(distreq)) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound as e: + raise DistutilsError(str(e)) + except VersionConflict as e: + raise DistutilsError(e.report()) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) + log.warn(msg, spec.key, self.build_directory, setup_base) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst) + shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if self.exclude_scripts: + return + for args in ScriptWriter.best().get_args(dist): + self.write_script(*args) + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + if is_script: + body = self._load_template(dev_path) % locals() + script_text = ScriptWriter.get_header(script_text) + body + self.write_script(script_name, _to_bytes(script_text), 'b') + + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://github.com/pypa/setuptools/issues/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + if self.dry_run: + return + + mask = current_umask() + ensure_directory(target) + if os.path.exists(target): + os.unlink(target) + with open(target, "w" + mode) as f: + f.write(contents) + chmod(target, 0o777 - mask) + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.whl'): + return [self.install_wheel(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) + ) + if len(setups) > 1: + raise DistutilsError( + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path, metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" + else: + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution( + None, + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), + ) + + # Convert the .exe to an unpacked egg + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path + egg_tmp = egg_path + '.tmp' + _egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(_egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf, 'w') + f.write('Metadata-Version: 1.0\n') + for k, v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) + f.close() + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + + def process(src, dst): + s = src.lower() + for old, new in prefixes: + if s.startswith(old): + src = new + src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old != 'SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile) + stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level', 'native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') + if not os.path.exists(txt): + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') + f.close() + + def install_wheel(self, wheel_path, tmpdir): + wheel = Wheel(wheel_path) + assert wheel.is_compatible() + destination = os.path.join(self.install_dir, wheel.egg_name()) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + self.execute( + wheel.install_as_egg, + (destination,), + ("Installing %s to %s") % ( + os.path.basename(wheel_path), + os.path.dirname(destination) + ), + ) + finally: + update_dist_caches(destination, fix_zipimporter_caches=False) + self.add_output(destination) + return self.egg_distribution(destination) + + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning + + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return '\n' + self.__editable_msg % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose > 2: + v = 'v' * (self.verbose - 1) + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') + if self.dry_run: + args.insert(0, '-n') + log.info( + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit as v: + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: + continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + def update_pth(self, dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist, + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key == 'setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location) + '\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = [] + to_chmod = [] + + def pf(src, dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src, dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if sys.dont_write_bytecode: + return + + from distutils.util import byte_compile + + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run, + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + + + Please make the appropriate changes for your system and try again.""").lstrip() + + def no_default_version_msg(self): + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + with io.open(sitepy) as strm: + current = strm.read() + + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in six.iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) + + INSTALL_SCHEMES = dict( + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix: + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) + + from distutils.util import subst_vars + + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + +def _pythonpath(): + items = os.environ.get('PYTHONPATH', '').split(os.pathsep) + return filter(None, items) + + +def get_site_dirs(): + """ + Return a list of 'site' dirs + """ + + sitedirs = [] + + # start with PYTHONPATH + sitedirs.extend(_pythonpath()) + + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([ + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "site-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) + else: + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) + lib_paths = get_path('purelib'), get_path('platlib') + for site_lib in lib_paths: + if site_lib not in sitedirs: + sitedirs.append(site_lib) + + if site.ENABLE_USER_SITE: + sitedirs.append(site.USER_SITE) + + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth', 'setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname, name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a configparser.RawConfigParser, or None + """ + f = open(dist_filename, 'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended - 12) + + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) + try: + part = f.read(cfglen) + # Read up to the first null byte. + config = part.split(b'\0', 1)[0] + # Now the config is in bytes, but for RawConfigParser, it should + # be text, so decode it. + config = config.decode(sys.getfilesystemencoding()) + cfg.readfp(six.StringIO(config)) + except configparser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts) == 3 and parts[2] == 'PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB', 'PLATLIB'): + contents = z.read(name) + if six.PY3: + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\', '/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) + finally: + z.close() + prefixes = [(x.lower(), y) for x, y in prefixes] + prefixes.sort() + prefixes.reverse() + return prefixes + + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load() + Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename, 'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir, path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + rel_paths = list(map(self.make_relative, self.paths)) + if rel_paths: + log.debug("Saving %s", self.filename) + lines = self._wrap_lines(rel_paths) + data = '\n'.join(lines) + '\n' + + if os.path.islink(self.filename): + os.unlink(self.filename) + with open(self.filename, 'wt') as f: + f.write(data) + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + @staticmethod + def _wrap_lines(lines): + return lines + + def add(self, dist): + """Add `dist` to the distribution map""" + new_path = ( + dist.location not in self.paths and ( + dist.location not in self.sitedirs or + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: + self.paths.append(dist.location) + self.dirty = True + Environment.add(self, dist) + + def remove(self, dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location) + self.dirty = True + Environment.remove(self, dist) + + def make_relative(self, path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + + +class RewritePthDistributions(PthDistributions): + @classmethod + def _wrap_lines(cls, lines): + yield cls.prelude + for line in lines: + yield line + yield cls.postlude + + prelude = _one_liner(""" + import sys + sys.__plen = len(sys.path) + """) + postlude = _one_liner(""" + import sys + new = sys.path[sys.__plen:] + del sys.path[sys.__plen:] + p = getattr(sys, '__egginsert', 0) + sys.path[p:p] = new + sys.__egginsert = p + len(new) + """) + + +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': + PthDistributions = RewritePthDistributions + + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + return re.compile(first_line_re.pattern.decode()) + + +def auto_chmod(func, arg, exc): + if func in [os.unlink, os.remove] and os.name == 'nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) + + +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) + else: + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 + # http://bit.ly/2h9itJX + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable + return magic == '#!' + + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): + pass + + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error as e: + log.debug("chmod failed: %s", e) + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) + return '#!' + cmdline + '\n' + + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class ScriptWriter: + """ + Encapsulates behavior around writing entry point scripts for console and + gui apps. + """ + + template = textwrap.dedent(r""" + # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r + __requires__ = %(spec)r + import re + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point(%(spec)r, %(group)r, %(name)r)() + ) + """).lstrip() + + command_spec_class = CommandSpec + + @classmethod + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", EasyInstallDeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2) + if wininst: + executable = "python.exe" + return cls.get_header(script_text, executable) + + @classmethod + def get_args(cls, dist, header=None): + """ + Yield write_script() argument tuples for a distribution's + console_scripts and gui_scripts entry points. + """ + if header is None: + header = cls.get_header() + spec = str(dist.as_requirement()) + for type_ in 'console', 'gui': + group = type_ + '_scripts' + for name, ep in dist.get_entry_map(group).items(): + cls._ensure_safe_name(name) + script_text = cls.template % locals() + args = cls._get_script_args(type_, name, header, script_text) + for res in args: + yield res + + @staticmethod + def _ensure_safe_name(name): + """ + Prevent paths in *_scripts entry point names. + """ + has_path_sep = re.search(r'[\\/]', name) + if has_path_sep: + raise ValueError("Path separators not allowed in script names") + + @classmethod + def get_writer(cls, force_windows): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): + return WindowsScriptWriter.best() + else: + return cls + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + # Simply write the stub with no extension. + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + +class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + + @classmethod + def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter suitable for Windows + """ + writer_lookup = dict( + executable=WindowsExecutableLauncherWriter, + natural=cls, + ) + # for compatibility, use the executable launcher by default + launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') + return writer_lookup[launcher] + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + "For Windows, add a .py extension" + ext = dict(console='.pya', gui='.pyw')[type_] + if ext not in os.environ['PATHEXT'].lower().split(';'): + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) + old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] + old.remove(ext) + header = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers + + @classmethod + def _adjust_header(cls, type_, orig_header): + """ + Make sure 'pythonw' is used for gui and and 'python' is used for + console (regardless of what sys.executable is). + """ + pattern = 'pythonw.exe' + repl = 'python.exe' + if type_ == 'gui': + pattern, repl = repl, pattern + pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) + new_header = pattern_ob.sub(string=orig_header, repl=repl) + return new_header if cls._use_header(new_header) else orig_header + + @staticmethod + def _use_header(new_header): + """ + Should _adjust_header use the replaced header? + + On non-windows systems, always use. On + Windows systems, only use the replaced header if it resolves + to an executable on the system. + """ + clean_header = new_header[2:-1].strip('"') + return sys.platform != 'win32' or find_executable(clean_header) + + +class WindowsExecutableLauncherWriter(WindowsScriptWriter): + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + """ + For Windows, add a .py extension and an .exe launcher + """ + if type_ == 'gui': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py', '.pyc', '.pyo'] + hdr = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) + yield ( + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + + +# for backward-compatibility +get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if six.PY2: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + return shutil.rmtree(path, ignore_errors, onerror) + + +def current_umask(): + tmp = os.umask(0o022) + os.umask(tmp) + return tmp + + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools + + argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0 + sys.argv.append(argv0) + main() + + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, + **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() + + def gen_usage(script_name): + return USAGE % dict( + script=os.path.basename(script_name), + ) + + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved + +class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning.""" + diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000..5d8f451 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,717 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist +import os +import re +import sys +import io +import warnings +import time +import collections + +from setuptools.extern import six +from setuptools.extern.six.moves import map + +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.command.sdist import walk_revctrl +from setuptools.command.setopt import edit_config +from setuptools.command import bdist_egg +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob + +from setuptools.extern import packaging +from setuptools import SetuptoolsDeprecationWarning + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + pat += r'\Z' + return re.compile(pat, flags=re.MULTILINE|re.DOTALL) + + +class InfoCommon: + tag_build = None + tag_date = None + + @property + def name(self): + return safe_name(self.distribution.get_name()) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def tags(self): + version = '' + if self.tag_build: + version += self.tag_build + if self.tag_date: + version += time.strftime("-%Y%m%d") + return version + vtags = property(tags) + + +class egg_info(InfoCommon, Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } + + def initialize_options(self): + self.egg_base = None + self.egg_name = None + self.egg_info = None + self.egg_version = None + self.broken_egg_info = False + + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + + def save_version_info(self, filename): + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + egg_info = collections.OrderedDict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) + + def finalize_options(self): + # Note: we need to capture the current value returned + # by `self.tagged_version()`, so we can later update + # `self.distribution.metadata.version` without + # repercussions. + self.egg_name = self.name + self.egg_version = self.tagged_version() + parsed_version = parse_version(self.egg_version) + + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) + list( + parse_requirements(spec % (self.egg_name, self.egg_version)) + ) + except ValueError: + raise distutils.errors.DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name, self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('', os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name) + '.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: + self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key == self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if six.PY3: + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def run(self): + self.mkpath(self.egg_info) + os.utime(self.egg_info, None) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + ep.require(installer=installer) + writer = ep.resolve() + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name + '.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-" * 78 + '\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + + +class FileList(_FileList): + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # 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 (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # 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': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = [ + item + for match_dir in glob(dir) + for item in distutils.filelist.findall(match_dir) + ] + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) + + +class manifest_maker(sdist): + template = "MANIFEST.in" + + def initialize_options(self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + + def write_manifest(self): + """ + Write the file list in 'self.filelist' to the manifest file + named by 'self.manifest'. + """ + self.filelist._repair() + + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) + + def warn(self, msg): + if not self._should_suppress_warning(msg): + sdist.warn(self, msg) + + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.check_license() + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + + if os.path.exists("setup.py"): + # setup.py should be included by default, even if it's not + # the script called to create the sdist + self.filelist.append("setup.py") + + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.graft(ei_cmd.egg_info) + + def prune_file_list(self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) + + +def write_file(filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution, 'zip_safe', None) + + bdist_egg.write_safety_flag(cmd.egg_info, safe) + + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, lines) + stream.writelines(lines) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = six.StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = io.StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [ + k.split('.', 1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value) + '\n' + cmd.write_or_delete_file(argname, filename, value, force) + + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep, six.string_types) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in sorted(ep.items()): + if not isinstance(contents, six.string_types): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + + +def get_pkg_info_revision(): + """ + Get a -r### off of PKG-INFO Version in case this is an sdist of + a subversion revision. + """ + warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning) + if os.path.exists('PKG-INFO'): + with io.open('PKG-INFO') as f: + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + return 0 + + +class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install.py new file mode 100644 index 0000000..31a5ddb --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig + +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://github.com/pypa/setuptools/issues/199/ +_install = orig.install + + +class install(orig.install): + """Use easy_install to install the package, w/dependencies""" + + user_options = orig.install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = orig.install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + orig.install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + + def finalize_options(self): + orig.install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return orig.install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return orig.install.run(self) + + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) + else: + self.do_egg_install() + + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000..edc4718 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,62 @@ +from distutils import log, dir_util +import os + +from setuptools import Command +from setuptools import namespaces +from setuptools.archive_util import unpack_archive +import pkg_resources + + +class install_egg_info(namespaces.Installer, Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name() + '.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [] + + def run(self): + self.run_command('egg_info') + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink, (self.target,), "Removing " + self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src, dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000..2b31c3e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,121 @@ +import os +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig + + +class install_lib(orig.install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) + + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' + yield base + '.opt-1.pyc' + yield base + '.opt-2.pyc' + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return orig.install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)", + dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = orig.install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000..1623427 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +from distutils import log +import distutils.command.install_scripts as orig +import os +import sys + +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + orig.install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + import setuptools.command.easy_install as ei + + self.run_command("egg_info") + if self.distribution.scripts: + orig.install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target, "w" + mode) + f.write(contents) + f.close() + chmod(target, 0o777 - mask) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000..5972a96 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/register.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/register.py new file mode 100644 index 0000000..98bc015 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/register.py @@ -0,0 +1,18 @@ +from distutils import log +import distutils.command.register as orig + + +class register(orig.register): + __doc__ = orig.register.__doc__ + + def run(self): + try: + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + orig.register.run(self) + finally: + self.announce( + "WARNING: Registering is deprecated, use twine to " + "upload instead (https://pypi.org/p/twine/)", + log.WARN + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/rotate.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000..b89353f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import shutil + +from setuptools.extern import six + +from setuptools import Command + + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, six.string_types): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + + for pattern in self.match: + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t, f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000..611cec5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +from setuptools.command.setopt import edit_config, option_base + + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd == 'saveopts': + continue # don't save our own options! + + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val + + edit_config(self.filename, settings, self.dry_run) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/sdist.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000..dc25398 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/sdist.py @@ -0,0 +1,221 @@ +from distutils import log +import distutils.command.sdist as orig +import os +import sys +import io +import contextlib + +from setuptools.extern import six + +from .py36compat import sdist_add_defaults + +import pkg_resources + +_default_revctrl = list + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + + +class sdist(sdist_add_defaults, orig.sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + README_EXTENSIONS = ['', '.rst', '.txt', '.md'] + READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + self.make_distribution() + + dist_files = getattr(self.distribution, 'dist_files', []) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + orig.sdist.read_template(self) + except Exception: + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() + raise + + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + has_leaky_handle = ( + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) + ) + if has_leaky_handle: + read_template = __read_template_hack + + def _add_defaults_python(self): + """getting python files""" + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") + + def check_readme(self): + for f in self.READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " + + ', '.join(self.READMES) + ) + + def make_release_tree(self, base_dir, files): + orig.sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os, 'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + with io.open(self.manifest, 'rb') as fp: + first_line = fp.readline() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rb') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if six.PY3: + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() + + def check_license(self): + """Checks if license_file' is configured and adds it to + 'self.filelist' if the value contains a valid path. + """ + + opts = self.distribution.get_option_dict('metadata') + + # ignore the source of the value + _, license_file = opts.get('license_file', (None, None)) + + if license_file is None: + log.debug("'license_file' option was not specified") + return + + if not os.path.exists(license_file): + log.warn("warning: Failed to find the configured license file '%s'", + license_file) + return + + self.filelist.append(license_file) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/setopt.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000..7e57cc0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools.extern.six.moves import configparser + +from setuptools import Command + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind == 'local': + return 'setup.cfg' + if kind == 'global': + return os.path.join( + os.path.dirname(distutils.__file__), 'distutils.cfg' + ) + if kind == 'user': + dot = os.name == 'posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + log.debug("Reading configuration from %s", filename) + opts = configparser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option, value in options.items(): + if value is None: + log.debug( + "Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section, option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section, option, value) + + log.info("Writing %s", filename) + if not dry_run: + with open(filename, 'w') as f: + opts.write(f) + + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames) > 1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-', '_'): self.set_value} + }, + self.dry_run + ) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/test.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/test.py new file mode 100644 index 0000000..dde0118 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/test.py @@ -0,0 +1,270 @@ +import os +import operator +import sys +import contextlib +import itertools +import unittest +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, evaluate_marker, + add_activation_listener, require, EntryPoint) +from setuptools import Command + +__metaclass__ = type + + +class ScanningLoader(TestLoader): + + def __init__(self): + TestLoader.__init__(self) + self._visited = set() + + def loadTestsFromModule(self, module, pattern=None): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + if module in self._visited: + return None + self._visited.add(module) + + tests = [] + tests.append(TestLoader.loadTestsFromModule(self, module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] + else: + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests) != 1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +# adapted from jaraco.classes.properties:NonDataProperty +class NonDataProperty: + def __init__(self, fget): + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) + + +class test(Command): + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Run single test, case or suite (e.g. 'module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + self.test_runner = None + + def finalize_options(self): + + if self.test_suite and self.test_module: + msg = "You may specify a module or a suite, but not both" + raise DistutilsOptionError(msg) + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module + ".test_suite" + + if self.test_loader is None: + self.test_loader = getattr(self.distribution, 'test_loader', None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) + + @NonDataProperty + def test_args(self): + return list(self._test_args()) + + def _test_args(self): + if not self.test_suite and sys.version_info >= (2, 7): + yield 'discover' + if self.verbose: + yield '--verbose' + if self.test_suite: + yield self.test_suite + + def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): + with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + with self.paths_on_pythonpath([project_path]): + yield + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(paths) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + er_d = dist.fetch_build_eggs( + v for k, v in dist.extras_require.items() + if k.startswith(':') and evaluate_marker(k[1:]) + ) + return itertools.chain(ir_d, tr_d, er_d) + + def run(self): + installed_dists = self.install_dists(self.distribution) + + cmd = ' '.join(self._argv) + if self.dry_run: + self.announce('skipping "%s" (dry run)' % cmd) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() + + def run_tests(self): + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + module = self.test_suite.split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + test = unittest.main( + None, None, self._argv, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), + exit=False, + ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + @property + def _argv(self): + return ['unittest'] + self.test_args + + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000..6db8888 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload.py @@ -0,0 +1,196 @@ +import io +import os +import hashlib +import getpass + +from base64 import standard_b64encode + +from distutils import log +from distutils.command import upload as orig +from distutils.spawn import spawn + +from distutils.errors import DistutilsError + +from setuptools.extern.six.moves.urllib.request import urlopen, Request +from setuptools.extern.six.moves.urllib.error import HTTPError +from setuptools.extern.six.moves.urllib.parse import urlparse + + +class upload(orig.upload): + """ + Override default upload behavior to obtain password + in a variety of different ways. + """ + def run(self): + try: + orig.upload.run(self) + finally: + self.announce( + "WARNING: Uploading via this command is deprecated, use twine " + "to upload instead (https://pypi.org/p/twine/)", + log.WARN + ) + + def finalize_options(self): + orig.upload.finalize_options(self) + self.username = ( + self.username or + getpass.getuser() + ) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) + + def upload_file(self, command, pyversion, filename): + # Makes sure the repository URL is compliant + schema, netloc, url, params, query, fragments = \ + urlparse(self.repository) + if params or query or fragments: + raise AssertionError("Incompatible url %s" % self.repository) + + if schema not in ('http', 'https'): + raise AssertionError("unsupported schema " + schema) + + # Sign if requested + if self.sign: + gpg_args = ["gpg", "--detach-sign", "-a", filename] + if self.identity: + gpg_args[2:2] = ["--local-user", self.identity] + spawn(gpg_args, + dry_run=self.dry_run) + + # Fill in the data - send all the meta-data in case we need to + # register a new release + with open(filename, 'rb') as f: + content = f.read() + + meta = self.distribution.metadata + + data = { + # action + ':action': 'file_upload', + 'protocol_version': '1', + + # identify release + 'name': meta.get_name(), + 'version': meta.get_version(), + + # file content + 'content': (os.path.basename(filename), content), + 'filetype': command, + 'pyversion': pyversion, + 'md5_digest': hashlib.md5(content).hexdigest(), + + # additional meta-data + 'metadata_version': str(meta.get_metadata_version()), + 'summary': meta.get_description(), + 'home_page': meta.get_url(), + 'author': meta.get_contact(), + 'author_email': meta.get_contact_email(), + 'license': meta.get_licence(), + 'description': meta.get_long_description(), + 'keywords': meta.get_keywords(), + 'platform': meta.get_platforms(), + 'classifiers': meta.get_classifiers(), + 'download_url': meta.get_download_url(), + # PEP 314 + 'provides': meta.get_provides(), + 'requires': meta.get_requires(), + 'obsoletes': meta.get_obsoletes(), + } + + data['comment'] = '' + + if self.sign: + data['gpg_signature'] = (os.path.basename(filename) + ".asc", + open(filename+".asc", "rb").read()) + + # set up the authentication + user_pass = (self.username + ":" + self.password).encode('ascii') + # The exact encoding of the authentication string is debated. + # Anyway PyPI only accepts ascii for both username or password. + auth = "Basic " + standard_b64encode(user_pass).decode('ascii') + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\r\n--' + boundary.encode('ascii') + end_boundary = sep_boundary + b'--\r\n' + body = io.BytesIO() + for key, value in data.items(): + title = '\r\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(value, list): + value = [value] + for value in value: + if type(value) is tuple: + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = str(value).encode('utf-8') + body.write(sep_boundary) + body.write(title.encode('utf-8')) + body.write(b"\r\n\r\n") + body.write(value) + body.write(end_boundary) + body = body.getvalue() + + msg = "Submitting %s to %s" % (filename, self.repository) + self.announce(msg, log.INFO) + + # build the Request + headers = { + 'Content-type': 'multipart/form-data; boundary=%s' % boundary, + 'Content-length': str(len(body)), + 'Authorization': auth, + } + + request = Request(self.repository, data=body, + headers=headers) + # send the data + try: + result = urlopen(request) + status = result.getcode() + reason = result.msg + except HTTPError as e: + status = e.code + reason = e.msg + except OSError as e: + self.announce(str(e), log.ERROR) + raise + + if status == 200: + self.announce('Server response (%s): %s' % (status, reason), + log.INFO) + if self.show_response: + text = getattr(self, '_read_pypi_response', + lambda x: None)(result) + if text is not None: + msg = '\n'.join(('-' * 75, text, '-' * 75)) + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (status, reason) + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + def _load_password_from_keyring(self): + """ + Attempt to load password from keyring. Suppress Exceptions. + """ + try: + keyring = __import__('keyring') + return keyring.get_password(self.repository, self.username) + except Exception: + pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000..07aa564 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import socket +import zipfile +import tempfile +import shutil +import itertools +import functools + +from setuptools.extern import six +from setuptools.extern.six.moves import http_client, urllib + +from pkg_resources import iter_entry_points +from .upload import upload + + +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) + + +class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + if 'pypi.python.org' in self.repository: + log.warn("Upload_docs command is deprecated. Use RTD instead.") + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + tmpl = "no files found in upload directory '%s'" + raise DistutilsOptionError(tmpl % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') + return b''.join(body_items), content_type + + def upload_file(self, filename): + with open(filename, 'rb') as f: + content = f.read() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = _encode(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if six.PY3: + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + body, ct = self._build_multipart(data) + + msg = "Submitting documentation to %s" % (self.repository) + self.announce(msg, log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urllib.parse.urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = http_client.HTTPConnection(netloc) + elif schema == 'https': + conn = http_client.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + try: + conn.connect() + conn.putrequest("POST", url) + content_type = ct + conn.putheader('Content-type', content_type) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error as e: + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + msg = 'Server response (%s): %s' % (r.status, r.reason) + self.announce(msg, log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + msg = 'Upload successful. Visit %s' % location + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (r.status, r.reason) + self.announce(msg, log.ERROR) + if self.show_response: + print('-' * 75, r.read(), '-' * 75) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/config.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/config.py new file mode 100644 index 0000000..b662604 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/config.py @@ -0,0 +1,656 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys + +import warnings +import functools +from collections import defaultdict +from functools import partial +from functools import wraps +from importlib import import_module + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.extern.packaging.version import LegacyVersion, parse +from setuptools.extern.six import string_types, PY3 + + +__metaclass__ = type + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def _get_option(target_obj, key): + """ + Given a target object and option key, get that option from + the target object, either through a get_{key} method or + from an attribute directly. + """ + getter_name = 'get_{key}'.format(**locals()) + by_attribute = functools.partial(getattr, target_obj, key) + getter = getattr(target_obj, getter_name, by_attribute) + return getter() + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + for option in handler.set_options: + value = _get_option(handler.target_obj, option) + config_dict[handler.section_prefix][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors, + distribution.package_dir) + meta.parse() + + return meta, options + + +class ConfigHandler: + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _exclude_files_parser(cls, key): + """Returns a parser function to make sure field inputs + are not files. + + Parses a value after getting the key so error messages are + more informative. + + :param key: + :rtype: callable + """ + def parser(value): + exclude_directive = 'file:' + if value.startswith(exclude_directive): + raise ValueError( + 'Only strings are accepted for the {0} field, ' + 'files are not accepted'.format(key)) + return value + return parser + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value, package_dir=None): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + parent_path = os.getcwd() + if package_dir: + if attrs_path[0] in package_dir: + # A custom path was specified for the module we want to import + custom_path = package_dir[attrs_path[0]] + parts = custom_path.rsplit('/', 1) + if len(parts) > 1: + parent_path = os.path.join(os.getcwd(), parts[0]) + module_name = parts[1] + else: + module_name = custom_path + elif '' in package_dir: + # A custom parent directory was specified for all root modules + parent_path = os.path.join(os.getcwd(), package_dir['']) + sys.path.insert(0, parent_path) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are translated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + def _deprecated_config_handler(self, func, msg, warning_class): + """ this function will wrap around parameters that are deprecated + + :param msg: deprecation message + :param warning_class: class of warning exception to be raised + :param func: function to be wrapped around + """ + @wraps(func) + def config_handler(*args, **kwargs): + warnings.warn(msg, warning_class) + return func(*args, **kwargs) + + return config_handler + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False, + package_dir=None): + super(ConfigMetadataHandler, self).__init__(target_obj, options, + ignore_option_errors) + self.package_dir = package_dir + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + parse_dict = self._parse_dict + exclude_files_parser = self._exclude_files_parser + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': self._deprecated_config_handler( + parse_list, + "The requires parameter is deprecated, please use " + "install_requires for runtime dependencies.", + DeprecationWarning), + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': exclude_files_parser('license'), + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + 'project_urls': parse_dict, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_file(value) + + if version != value: + version = version.strip() + # Be strict about versions loaded from file because it's easy to + # accidentally include newlines and other unintended content + if isinstance(parse(version), LegacyVersion): + tmpl = ( + 'Version loaded from {value} does not ' + 'comply with PEP 440: {version}' + ) + raise DistutilsOptionError(tmpl.format(**locals())) + + return version + + version = self._parse_attr(value, self.package_dir) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + 'py_modules': parse_list, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directives = ['find:', 'find_namespace:'] + trimmed_value = value.strip() + + if trimmed_value not in find_directives: + return self._parse_list(value) + + findns = trimmed_value == find_directives[1] + if findns and not PY3: + raise DistutilsOptionError( + 'find_namespace: directive is unsupported on Python < 3.3') + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + if findns: + from setuptools import find_namespace_packages as find_packages + else: + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) + + def parse_section_data_files(self, section_options): + """Parses `data_files` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['data_files'] = [(k, v) for k, v in parsed.items()] diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/dep_util.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/dep_util.py new file mode 100644 index 0000000..2931c13 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +from distutils.dep_util import newer_group + +# yes, this is was almost entirely copy-pasted from +# 'newer_pairwise()', this is just another convenience +# function. +def newer_pairwise_group(sources_groups, targets): + """Walk both arguments in parallel, testing if each source group is newer + than its corresponding target. Returns a pair of lists (sources_groups, + targets) where sources is newer than target, according to the semantics + of 'newer_group()'. + """ + if len(sources_groups) != len(targets): + raise ValueError("'sources_group' and 'targets' must be the same length") + + # build a pair of lists (sources_groups, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources_groups)): + if newer_group(sources_groups[i], targets[i]): + n_sources.append(sources_groups[i]) + n_targets.append(targets[i]) + + return n_sources, n_targets diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/depends.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/depends.py new file mode 100644 index 0000000..45e7052 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +import sys +import imp +import marshal +from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode + + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name, self.requested_version) + return self.name + + def version_ok(self, version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + def get_version(self, paths=None, default="unknown"): + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f, p, i = find_module(self.module, paths) + if f: + f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module, self.attribute, default, paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + def is_present(self, paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + def is_current(self, paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) + + if kind == PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts, module)) + + return info + + +def get_module_constant(module, symbol, default=-1, paths=None): + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix, mode, kind) = find_module(module, paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind == PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind == PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind == PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) + + finally: + if f: + f.close() + + return extract_constant(code, symbol, default) + + +def extract_constant(code, symbol, default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + if symbol not in code.co_names: + # name's not there, can't possibly be an assignment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg + + if op == LOAD_CONST: + const = code.co_consts[arg] + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): + return const + else: + const = default + + +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + + +_update_globals() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/dist.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/dist.py new file mode 100644 index 0000000..ddb1787 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/dist.py @@ -0,0 +1,1285 @@ +# -*- coding: utf-8 -*- +__all__ = ['Distribution'] + +import io +import sys +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +from distutils.errors import DistutilsOptionError +from distutils.util import strtobool +from distutils.debug import DEBUG +from distutils.fancy_getopt import translate_longopt +import itertools + +from collections import defaultdict +from email import message_from_file + +from distutils.errors import ( + DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, +) +from distutils.util import rfc822_escape +from distutils.version import StrictVersion + +from setuptools.extern import six +from setuptools.extern import packaging +from setuptools.extern.six.moves import map, filter, filterfalse + +from . import SetuptoolsDeprecationWarning + +from setuptools.depends import Require +from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration +from .unicode_utils import detect_encoding +import pkg_resources + +__import__('setuptools.extern.packaging.specifiers') +__import__('setuptools.extern.packaging.version') + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", DistDeprecationWarning) + return get_unpatched(cls) + + +def get_metadata_version(self): + mv = getattr(self, 'metadata_version', None) + + if mv is None: + if self.long_description_content_type or self.provides_extras: + mv = StrictVersion('2.1') + elif (self.maintainer is not None or + self.maintainer_email is not None or + getattr(self, 'python_requires', None) is not None): + mv = StrictVersion('1.2') + elif (self.provides or self.requires or self.obsoletes or + self.classifiers or self.download_url): + mv = StrictVersion('1.1') + else: + mv = StrictVersion('1.0') + + self.metadata_version = mv + + return mv + + +def read_pkg_file(self, file): + """Reads the metadata values from a file object.""" + msg = message_from_file(file) + + def _read_field(name): + value = msg[name] + if value == 'UNKNOWN': + return None + return value + + def _read_list(name): + values = msg.get_all(name, None) + if values == []: + return None + return values + + self.metadata_version = StrictVersion(msg['metadata-version']) + self.name = _read_field('name') + self.version = _read_field('version') + self.description = _read_field('summary') + # we are filling author only. + self.author = _read_field('author') + self.maintainer = None + self.author_email = _read_field('author-email') + self.maintainer_email = None + self.url = _read_field('home-page') + self.license = _read_field('license') + + if 'download-url' in msg: + self.download_url = _read_field('download-url') + else: + self.download_url = None + + self.long_description = _read_field('description') + self.description = _read_field('summary') + + if 'keywords' in msg: + self.keywords = _read_field('keywords').split(',') + + self.platforms = _read_list('platform') + self.classifiers = _read_list('classifier') + + # PEP 314 - these fields only exist in 1.1 + if self.metadata_version == StrictVersion('1.1'): + self.requires = _read_list('requires') + self.provides = _read_list('provides') + self.obsoletes = _read_list('obsoletes') + else: + self.requires = None + self.provides = None + self.obsoletes = None + + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. + """ + version = self.get_metadata_version() + + if six.PY2: + def write_field(key, value): + file.write("%s: %s\n" % (key, self._encode_field(value))) + else: + def write_field(key, value): + file.write("%s: %s\n" % (key, value)) + + + write_field('Metadata-Version', str(version)) + write_field('Name', self.get_name()) + write_field('Version', self.get_version()) + write_field('Summary', self.get_description()) + write_field('Home-page', self.get_url()) + + if version < StrictVersion('1.2'): + write_field('Author', self.get_contact()) + write_field('Author-email', self.get_contact_email()) + else: + optional_fields = ( + ('Author', 'author'), + ('Author-email', 'author_email'), + ('Maintainer', 'maintainer'), + ('Maintainer-email', 'maintainer_email'), + ) + + for field, attr in optional_fields: + attr_val = getattr(self, attr) + + if attr_val is not None: + write_field(field, attr_val) + + write_field('License', self.get_license()) + if self.download_url: + write_field('Download-URL', self.download_url) + for project_url in self.project_urls.items(): + write_field('Project-URL', '%s, %s' % project_url) + + long_desc = rfc822_escape(self.get_long_description()) + write_field('Description', long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + write_field('Keywords', keywords) + + if version >= StrictVersion('1.2'): + for platform in self.get_platforms(): + write_field('Platform', platform) + else: + self._write_list(file, 'Platform', self.get_platforms()) + + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + write_field('Requires-Python', self.python_requires) + + # PEP 566 + if self.long_description_content_type: + write_field( + 'Description-Content-Type', + self.long_description_content_type + ) + if self.provides_extras: + for extra in self.provides_extras: + write_field('Provides-Extra', extra) + + +sequence = tuple, list + + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x=' + value) + assert not ep.extras + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr, value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr, value) + ) + + +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + list(itertools.starmap(_check_extra, value.items())) + except (TypeError, ValueError, AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + + +def _check_extra(extra, reqs): + name, sep, marker = extra.partition(':') + if marker and pkg_resources.invalid_marker(marker): + raise DistutilsSetupError("Invalid environment marker: " + marker) + list(pkg_resources.parse_requirements(reqs)) + + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + tmpl = "{attr!r} must be a boolean value (got {value!r})" + raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) + + +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + if isinstance(value, (dict, set)): + raise TypeError("Unordered types are not allowed") + except (TypeError, ValueError) as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid project/version requirement specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError as e: + raise DistutilsSetupError(e) + + +def check_test_suite(dist, attr, value): + if not isinstance(value, six.string_types): + raise DistutilsSetupError("test_suite must be a string") + + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr + " must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only " + ".-separated package names in setup.py", pkgname + ) + + +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(_Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _DISTUTILS_UNSUPPORTED_METADATA = { + 'long_description_content_type': None, + 'project_urls': dict, + 'provides_extras': set, + } + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__(self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + attrs = attrs or {} + if 'features' in attrs or 'require_features' in attrs: + Feature.warn_deprecated() + self.require_features = [] + self.features = {} + self.dist_files = [] + # Filter-out setuptools' specific options. + self.src_root = attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + self.dependency_links = attrs.pop('dependency_links', []) + self.setup_requires = attrs.pop('setup_requires', []) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + vars(self).setdefault(ep.name, None) + _Distribution.__init__(self, { + k: v for k, v in attrs.items() + if k not in self._DISTUTILS_UNSUPPORTED_METADATA + }) + + # Fill-in missing metadata fields not supported by distutils. + # Note some fields may have been set by other tools (e.g. pbr) + # above; they are taken preferrentially to setup() arguments + for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items(): + for source in self.metadata.__dict__, attrs: + if option in source: + value = source[option] + break + else: + value = default() if default else None + setattr(self.metadata, option, value) + + if isinstance(self.metadata.version, numbers.Number): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "Normalizing '%s' to '%s'" % ( + self.metadata.version, + normalized_version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + self._finalize_requires() + + def _finalize_requires(self): + """ + Set `metadata.python_requires` and fix environment markers + in `install_requires` and `extras_require`. + """ + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + + if getattr(self, 'extras_require', None): + for extra in self.extras_require.keys(): + # Since this gets called multiple times at points where the + # keys have become 'converted' extras, ensure that we are only + # truly adding extras we haven't seen before here. + extra = extra.split(':')[0] + if extra: + self.metadata.provides_extras.add(extra) + + self._convert_extras_requirements() + self._move_install_requirements_markers() + + def _convert_extras_requirements(self): + """ + Convert requirements in `extras_require` of the form + `"extra": ["barbazquux; {marker}"]` to + `"extra:{marker}": ["barbazquux"]`. + """ + spec_ext_reqs = getattr(self, 'extras_require', None) or {} + self._tmp_extras_require = defaultdict(list) + for section, v in spec_ext_reqs.items(): + # Do not strip empty sections. + self._tmp_extras_require[section] + for r in pkg_resources.parse_requirements(v): + suffix = self._suffix_for(r) + self._tmp_extras_require[section + suffix].append(r) + + @staticmethod + def _suffix_for(req): + """ + For a requirement, return the 'extras_require' suffix for + that requirement. + """ + return ':' + str(req.marker) if req.marker else '' + + def _move_install_requirements_markers(self): + """ + Move requirements in `install_requires` that are using environment + markers `extras_require`. + """ + + # divide the install_requires into two sets, simple ones still + # handled by install_requires and more complex ones handled + # by extras_require. + + def is_simple_req(req): + return not req.marker + + spec_inst_reqs = getattr(self, 'install_requires', None) or () + inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) + simple_reqs = filter(is_simple_req, inst_reqs) + complex_reqs = filterfalse(is_simple_req, inst_reqs) + self.install_requires = list(map(str, simple_reqs)) + + for r in complex_reqs: + self._tmp_extras_require[':' + str(r.marker)].append(r) + self.extras_require = dict( + (k, [str(r) for r in map(self._clean_req, v)]) + for k, v in self._tmp_extras_require.items() + ) + + def _clean_req(self, req): + """ + Given a Requirement, remove environment markers and return it. + """ + req.marker = None + return req + + def _parse_config_files(self, filenames=None): + """ + Adapted from distutils.dist.Distribution.parse_config_files, + this method provides the same functionality in subtly-improved + ways. + """ + from setuptools.extern.six.moves.configparser import ConfigParser + + # Ignore install directory options if we have a venv + if six.PY3 and sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser() + for filename in filenames: + with io.open(filename, 'rb') as fp: + encoding = detect_encoding(fp) + if DEBUG: + self.announce(" reading %s [%s]" % ( + filename, encoding or 'locale') + ) + reader = io.TextIOWrapper(fp, encoding=encoding) + (parser.read_file if six.PY3 else parser.readfp)(reader) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = self._try_str(parser.get(section, opt)) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + @staticmethod + def _try_str(val): + """ + On Python 2, much of distutils relies on string values being of + type 'str' (bytes) and not unicode text. If the value can be safely + encoded to bytes using the default encoding, prefer that. + + Why the default encoding? Because that value can be implicitly + decoded back to text if needed. + + Ref #1653 + """ + if six.PY3: + return val + try: + return val.encode() + except UnicodeEncodeError: + pass + return val + + def _set_command_options(self, command_obj, option_dict=None): + """ + Set the options for 'command_obj' from 'option_dict'. Basically + this means copying elements of a dictionary ('option_dict') to + attributes of an instance ('command'). + + 'command_obj' must be a Command instance. If 'option_dict' is not + supplied, uses the standard option dictionary for this command + (from 'self.command_options'). + + (Adopted from distutils.dist.Distribution._set_command_options) + """ + command_name = command_obj.get_command_name() + if option_dict is None: + option_dict = self.get_option_dict(command_name) + + if DEBUG: + self.announce(" setting options for '%s' command:" % command_name) + for (option, (source, value)) in option_dict.items(): + if DEBUG: + self.announce(" %s = %s (from %s)" % (option, value, + source)) + try: + bool_opts = [translate_longopt(o) + for o in command_obj.boolean_options] + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + is_string = isinstance(value, six.string_types) + if option in neg_opt and is_string: + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts and is_string: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError( + "error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError as msg: + raise DistutilsOptionError(msg) + + def parse_config_files(self, filenames=None, ignore_option_errors=False): + """Parses configuration files from various levels + and loads configuration. + + """ + self._parse_config_files(filenames=filenames) + + parse_configuration(self, self.command_options, + ignore_option_errors=ignore_option_errors) + self._finalize_requires() + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + opts = dist.get_option_dict('easy_install') + opts.clear() + opts.update( + (k, v) + for k, v in self.get_option_dict('easy_install').items() + if k in ( + # don't use any other settings + 'find_links', 'site_dirs', 'index_url', + 'optimize', 'site_dirs', 'allow_hosts', + )) + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1] + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + new = [item for item in value if item not in old] + setattr(self, name, old + new) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + import io + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + msg = ( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65." + ) + warnings.warn(msg, DistDeprecationWarning, stacklevel=3) + + def __init__( + self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras): + self.warn_deprecated() + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features, (str, Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r, str) + ] + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er + + if isinstance(remove, str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or " + "at least one of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self, dist): + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description + " is required, " + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + def exclude_from(self, dist): + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + def validate(self, dist): + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) + + +class DistDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in dist in setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/extension.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/extension.py new file mode 100644 index 0000000..2946889 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +import re +import functools +import distutils.core +import distutils.errors +import distutils.extension + +from setuptools.extern.six.moves import map + +from .monkey import get_unpatched + + +def _have_cython(): + """ + Return True if Cython can be imported. + """ + cython_impl = 'Cython.Distutils.build_ext' + try: + # from (cython_impl) import build_ext + __import__(cython_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +# for compatibility +have_pyrex = _have_cython + +_Extension = get_unpatched(distutils.core.Extension) + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if _have_cython(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) + + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py new file mode 100644 index 0000000..cb2fa32 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info >= (3, ): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'six', 'packaging', 'pyparsing', +VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71eb33e63859e3903f8e8438654adb3543933213 GIT binary patch literal 2429 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 aWH&Ac+~Tl-_{<JebAhWm4rV?V7DfO~IfD5B literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/glibc.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/glibc.py new file mode 100644 index 0000000..a134591 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/glibc.py @@ -0,0 +1,86 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # 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 + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# 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(): + """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/Teletype/venv/lib/python3.7/site-packages/setuptools/glob.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/glob.py new file mode 100644 index 0000000..9d7cbc5 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/glob.py @@ -0,0 +1,174 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, bytes): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, bytes): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, bytes): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/gui-32.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~P<Y7~3=9l>^1JvLws4+R+`;H`Rxu<avsj^^ zC_lX@F;^iuF)uH_L?J0vp{O)ZAu~_G#XndfH$Np+kC&HA1#0q>-~%@n7_IAu;r1_A zyBCA`>$`s&t?QPpwdh`Aw61$!f>w76n6~cT1g3SnFM?_N?uAC{x`Q&4GeBlQjm4k> zTp1XA7?~LuH+BcYBp)y^GjcO>GBBKCU|{frhzhGQFfa%(Ffcp-@f{#+CI$vp5SIZ# zGdM6p0*!%zfr){k0jv<D52P7PgGHda7#K``GB9YsdE_%XzA!ML#LWW+uv2iEs8^C& zQNqB$@b)CsUm(ANA{$AA0s}*WUQtS7Ng@M7h62>@N(>AP=a3XJfbDhAgD7J-q75>S z5#q@Y80rq7ij49GYX}5(yQpyV1~7JUIJBHB{TUn@rhO>9`$eydE^`)Rz>5kl28QM% z9LE2RZ+E(=2pnTj>MdYweOnj)nyq&>$WPrqDiU2R+%_?#%<iuhY?Ml+TL0GxglENs zy=VmM<zfDA{QnqRjN5A_<Nw_uAl1ShY|d`hcWVx}{;%T$D-DAw?RHTSh(E@rbj*#B zAucvL@^IrD9u@|Mg$+WE48}(~TU0n$7#PC3x2Q<4FffF7?*Y?Y?A_;E4wMM@rl>GD z+US?E9CQ31)5X|wp!8#JiwX}T14BS>kBR^j14CeMh>A#1uZxOEK=_O4ydb}cG}NeY zFz~l7VPIfrs8QjG;cuDAz`)Sk1J)SWI|Zx}qNmqKMI<onMI0{!L$8a9Lh}(3M966$ zYN%o1j_Gw_;V$L!Xt0PW5e2!YH$;WU`cM()F$M;ZVCnlThH$X`V6%FssK_ugFa*8$ z$;H5s#hAgu$iVP|g_D7y`vaKW+oGbw%)k&3_F@Ys$gvu)WnrrBaWF7|)pUOd4|_2c zEG^RAqawh<z!2YkEYA4M3npF$hQ=eH@H>142Abb+1c!!&ch{)MbRS1{eHKf=i!KfZ zhVC2{4RB=3bjC7tTJY~<59t2h8KWZeViq{Ocv=sX2=VXpXLJvI(E%1=X+2Q-u8ZHj z!$(D?<zz`Z|GtYsFLGg0CG5>LDgq28K3y&<GN5GQ{Q9zuQmN#(!;Gau#s@4xsmet~ zhJk;|0Z<CN_`CIXi9j$Y{Wx-fyv)P=+4y!tjfxCI$?Ps46`2k`x7U+EjMm#FB4Blr z91ILyJ}Mf`N5E>kLsUeLu`&F2W$1QgaO*T_YB^bA&c9DQ=*3MQkbx`^54bbB2fR2A z6DfVyV9&tcYWDyC|85r*k@&dS=;k9FhvVa7yAOd`@bIfqVPPm0TF9W_$k2MAgfojF z;J+xt0|$m3j0_A6htD*>i7-Bp<r2{8qQV36Pp6BDNT-X6M6ZjAOu%s$6&_Hgd6C8r zatTisV}^mS1H*9_6&V*${VOW)z=5ILMJ1-!M}-BHRwaV67{HJbL<VFr{1@eU;K0y& zpj0Mf#X|>%7s{**49y1|0$%)M2ARlVe4zPA#NqA`6_#!v6`rjBL7luHm;M*!0GaHg z!qUs45)k-blm%i6dq%@U2Zq->x>-~}`p%p=15F$v;Kb4E$p9@Ex?@yiv=8kB`O*4j zZvj)CZtoIs72fTlBGJv#(Oba?DG#~?99k}w{?tD1Xnnf3gpIN0UU!X(NETz*3tcu) zj(w4F;-LdW=!<G@28QnAXgO#f*!+9lKkBSN<x026#-Lsn{fr|I9T);$c!G5JsHk+a zY-~Ql(;L9}ni=6f?L%(XpL=WA8EcNk$8{f#jfSQ8#y1j7$mNF!69Yqci;4mh149M_ zBLhRPkBUTK76T}n{)>t{Z~$d&lw95G!Xg4HHLMSniS&9hG+5}B@PINiDF0d?EPsCt zTo#CUK*OWUgAr7a{^%Cfc;vv)&8zdsfuU2NThstVd$5Fc25|Jcs7Pcn1iV<Z1(eU5 zk8m{q`(J7Tc1VWABL{{TexSGnMXDwfC{lTP-I(LLdsIM9H$L-1hZB^mLB2X14)MYi z6$M5HhM=$)CTkcN!g}|x=zxk5=WYfDQ2D_KGD867J_qaL#R6R%EhkI38h&z>ur~bU zEq$HE1oA}-*q98FN1)J-fRxCs2TF{)d09YS5#@N~z_5@9<c}T|8Ab+%E?xl;2V#3? zi;4;(14BoTiUufDLsU3|dRtVKKxOZXj^F?PcN_HjsHg;nb-Ji%yiou3|9|(7<|6`~ zH7Y!<|4X^UG9Em1V0Z~?d<J*NsPKe#uTjxqVqoZH(e89nk#PVOPH&k(!4=+Fq9XIc z?dSjhooxF-$)))SPxCPr>-%-`;PlWPqN32vvMb<)GFXXw^AQ%1^zWKyVEbS2fQ6wt z!BX$*q(IdYSkt>7Aah}w{?<He-lJl|#K6E1dz=lFaidFIyM0tRx=U1e0>fTxSpo`L zj<Ad~psY9p6wshpD`o%*^Th7}X+(;+Vs?1MfyyXQ#S6-$K>>j;+W!3iAMoM;D4cr0 z9&bJ(5DzNC?Gbt)CD1|v1xJQ%ULFNUhAhT_z!x%q|Nn13!gEM~A&V#D!xsmJ7suoo z7>vJlmOe2)&>hQReUE?Y0qbL>3NMo685oW;h%qoQgn__|S8^a{iZq}2|MDyY1B3Aa z%TgY&+L9}su^hoK<})%dM0S?``R2^yP+A`RB2borA+q_${}SouAOA|kx-T63#oB$M z`Jw#5hiuF|Qx|ACGQ4KpIYY>i;hUpMeW@l$sU%3LNcV|@KUtd}$RB*b#>~<SQMd!F z&_Si4MCQc_IaHSgKwakh<iBO<lTzj27sb2`4BbC^T?GQd{+IFuzqrZAz|iUXBsl!V zS8zQebKLdMzyJULzu;tGVCZ&z@`6pCf#LA~QjQlsAYUBb!64wsaCqSXYe$B#ERnd@ z1EuUcK+X2oY}UtW*}IP|2FZXD***mZhRDdpd$d8Nd#PL&OIW8VNbbc_6baTWsff74 z#+P=2%ze$e5Tw47hpG9XLh~V(#-E_pO3kaRe{sf_b_xhMGK6;@I{1UNo23=x_wHZK z&*cw3XX|ER2L%y_^|2CA4a(GM*nCjIsqtrlfFncAxp?CPafe@AQf6Riur*L{WMC*^ zeKA{+f#JU?$gUSmiVO^qhr9oWcE1VhF699G&-z1=Qsch_AxDOCsqS;y;6Ohp5con! zm4Ttrj|bF8iG0n~d`uzizo^6m2Zp#<hymTM9L+yOYQ>rl2n4)%ssai?o<<Ld`q;zW zt~|{L6apYx5IVp<w?0@TZwt0iqA`KzfBpae+6NE*U<Dg=NST2lGWIY;ugn7n2AE!7 zj^>{t-L5>f!caZUAV*Hdp**lT^$$Z>uj`+H|D`;j2rUOW@I&(vp4M-r5|*xiN`zl@ z$S{EFVy+kUG7JpezJEG7x{t-3gwz1tAu2rGJ}NA&mr62?4|KVxaI_pK6>IzjD*KE0 znr%C@z+wAxsw${<`q})8rO5F6&E|*9B|O>}JJ_3#Gd90uEdADf;@|@g=7S(gfcaqe zspdz_2VXLkuzg<LdZ~m9qV5$)or?-b{NZjF6&8r~XFxeTy!9l1%Op_73+}$zU7{lL z{TQgr-Cd(1P|AJqB@=&ZD+2?=YxOR+=3|TyvtBZmXtx|F(TAukecFBV;7g{`#OBA$ zCBg`0EeA@>n_n}Qz6CX#qvPTae?JZ~xI_$Q2!G2A1_lO*Xz446AteyW*Nmm#qT@h? zQ2gOe@#f<!%`X{C=I{Fd?_XUv8}o(c5C4r1b&EA0V_C_-$k<qNr{z+KPRq9vx$lP< z82&Sq@PKHB|D{Jd#a~M_J^~FLbc(;`Ykc&dfq|h@{56a5C9tW+2SDcX7$4|lhuBg2 zt@$xCe``6Ur6mAzH8>gnFO~RTD)PTn;D0Gk)_+h;2dIJyC<$n~2@DK2z8x0c8T-RB zmZPM$+n2}sbSb-KtUzhuYgWrxfs!oCSP_tbL}>y@K%yklGFAp8pit@$5>P1du#8nH zwX=-XD7EV@<uE?rU?Eq+=HX_2xcpm#omHu+_309+=2`(}{-&=C3=COJ|4TWt{s+DY zRRg(0z^${C<Fz<Q_o3siKNuMp7+!+<$JVDym^vgu=Kb%C{bM0l63V}iE#L)*8UsUQ z>wywxx7T7_Y&QBOyf!f<oHlx;9G#_qUNiUBF}hjEm0q#_U7~6kD^eoeeO%j>!_rlv ztTq5_?f+7d7k9t`AkbOM@tU*SRmA#m2~&qex9cD4!zEtUt{g?Kma#G=l3;xbWv(!N zGB1`u^jXHL@VBgHU|`TL{bO0GQKlUBzw{3%XjNV`K~%i#Wnf?c8B(uZ%3)cmP@dN9 z%42=F1Qe`gV7ow;vRlSVKzK3`IRyw$1;Wz+@m{b<f=uEl70VKf3kHEsgBKkVpnwzU zKK5G6GWJL5(=4UPPLA$_uVuoZUX*$9Qw5|%pxYH>7*mIY@qzfb=#$WL$yeh0P3e<6 zKv`A!MBx8YiEdvJkcje$z;0iG|D{k)w<}NJ|5AbPH>3|VKVXKH6UV_7qe|>yYhF-s zT*~zM@XHmTvIA6RcDr(fb$>kO#sg|fC%;HFVqoZW<LLIt>E!G7$msNA>E^TMEs%C( zC=u%B?U8b1X!R&4Wq-k-&%n^h*6qe(%{oESk)cGa+l>Pu&+(!}9b^tmw;RVdhXSTj zk!FtqrekhAjIX)6IXd~e9auWuSh|nJ#U5f|0H^upH=xws>-*tF8YnxserVpYhJk^B zu}-+x^+P}w2PhZJHvxqZ&ufA1h7+L5&6k6JJBvs21CEB;KMW=8-M&AX6AS)AgRI&1 zg^D8sL#a@=D@QkPg0v$8|8^F~<_8?HhqD+!rnUb6|35Mknx&fGC<Ghdwv6Q|m3`qN z&cFbQwqQsT;l&v-khP%J!E4`cR}SmLC3nI)U0-y%J^<Ci!T(EndR-p`9Cv;4|NsB` z<F0R<7#J8{IDxx00{?xVbbqK|?{<CAA@LflF8IX+6Hvw4eGDGE;DSB4J653eb}75@ zftRxw7#PBvf3p;o_E!IC{a=>X?aR~c%F!jze1N6-AWO@ok|3+VKc&810e@RAmDpGX z{w+1{3i#J@sYJ~x@L#E7SHS<4OC<tUf&WXnn_d5~Sl0e2I`rC}f1AU9{%xNBU%T;d zbNI)<&GX-D8~$w$fBCn0{(Wu4zs=zf|2EG*uQedHz2@%{Xt`7(VkKBA;NbY*^^axj zpQ1O$2jZho9_HW1z`u=C`{3(O;J6Fl|ALu;A^g9n$^!>b(Eb-yc;LX$cpN0!_&?zl z14B8er+F_P8rU!9nlXUXy?A8;s>M5m92s6L)Ma4E02P@3FEk(Ffhx>!dE~$VF|GAL ziD-ris6GB)R0G^&D`EX#%JKgKR4FJ%Pk>?+Bq*x$z=7dR7RL)EP($r-7RL*F8Kg$S zhu7TQY^?`MnEqb?HHb?&iax*^0H79x@qyR;tp`d4y7^j9mN5Ol2v);W^aiG;*>;OI zsHT+60MRd8Eg;1k7uaTyP~?kxa|VWtgoh3c86Kea@IsKoB3loXI%TYgbYOV#*NlN- zhr>e$hT|+ME+7TT|NsAQw%q|THnK!I1H^do)*NCkPZmQK6R5ij5;Z;$dpJuXL*T0e z!;2Rp3=CNuFYG{G12qkdZ#!GcS|~U&@V6WV)jYB$3XTk2t^$idji%;W9tQr_xuCAK z=^AZEh8G4p3=EOoKRRn~wEi!t_;0!bBq$9Q{Loo?r?d7+XX%6HcPyQycdWk`g}?Z& z&A?#ER`S;Rdy&_Fvlkz=LCw$?54AzX!2j$2A%@-ti$V=Mrwz(CJeIXjN?9#kAC&Nc z%&fi9>H44>WJ7oDjo0%t3LZKz>_`EHLHxh}|06RhK>QLA-yg(>HD={O9f?{2hEk1A zuots9UgStIFhqi){m<Y3|BY`uH`fX<lyGEmya)zK9Dczk!oUD2JwXEoAccqjfjbD$ z6qCh}#Rw8z3lq%(k1V{H3*jHmVgw1i=!0^*|A)Q!tOe?Kg}sQhW?%?=@x%&5mJ5Q& zlVJ81FgeEpBw}g~BIQ5{;gzxj!wXj}P-v(u2Br2mh`X9?T@)M{7)x1S^cX`j#7#qJ zE_k8-7g9Q9MPwL&BKx-xq$~5M*L6m~e^HYM4h&iU;yY{q?C_0ZU`VrM1&v9US}e3- zaA0WM0pfs$`AgMzax;RYJ0ut!7)m9Zca$(VFz}TL7@xG<@PfgCfq&}3PTwc5nL&M| z+s?r+&f9|%T`5PF%!>$6s(mq67u2FG<;W6v;SLrEH(_AtjQ#WC2QNsXmLp60h1#G0 z|0Dm48a!}dSiAs~jsoo%7#7<oI5NEGv4yJQc)<Wt^@7<ND!}>T{qO((BZFTo2Z>uB zD`5|KaTg@=qS1<hp(XZ62^;@*-xIHyv$!Gy1Hv*uetN<2>Hq&u*9V}!5L>_txqtuv zzi|Ec|9@xgpVy|{u5Y?Ix;Z<2?*s(C*lr3cWDj?zzUX$n)9L!4x%LS|DO<n`MvxZ8 zfB*kOQ&zX@gV(~w2OK~up+Y-A#n6lMf(#6YU%a<tV0c;a@Be>rK?f=w!d?XPGcW|a z$OeTJs996<V&$j*|C<jeSbr#G0hJvuW`g++)*ng}j1M^cXJt`vWccpJ0~&oT^$QN~ zwQ2QGaAat<XV?vzAt_Y|e!(jY>R__B9w-&=brZ>A>U87iWQ*u@ljw9~dCl8x-&x1e zY1bJi(HY0m=*Pn(2<oH8J4C-`GClw=m1;Q{O4P%;OL@M#@qo-NkqmnwEXu&pn8x$} z-T(j1X%Y<0Y7EV391M|hv4_7o@;H>RHCJ*ll&JjoWU1ip7VKd9&&a>+z-u1<eFp*q zUcA%=g<$iK|E0{FY={4|LDFnk_lMWQ-M#`{t{ne;d0uP<6<l`zOV~i=OZ{`0W4^ib zI0T1vf9SqhV$@vE!BDEx?aIN(_FB7(`M)nm_xTsK|NsAYZnpbhD*WOqKLbOvg;ptl z_xTO>FH%4T)^ae^UyX}~X4J+v74UJZqn)mQg1cjRKrvx_AiTR4)J*Q}UGn$;|IV#j zK;+&#AhLA_nEU`H&w$AnVDbW(JOCz7{Qdv`#rJRj|F?cCHGSdB59@jx9|!<}7nk`! zSyrTB?}oqs|1*?ub+@howWJaX{(?pdPH-_Wd~@S*D2)qy;lRtl5V;G~j|cT*p`!wz z0fFuh2mi4i1dR%81$B5|Gj*Q=4+%^Jse=s(fW`xUvLX!$Fm)gL=AhER-<tma|9|6? z);IZEV*mgD-zD7HdjsV1-UncE&)@(5JEp$>`~QE-CH@w9E(QkY=Di>V44re2{Qdu* zzlWQPfuZY=j)F}@xgh_(L;U+1A|5#~G(X@s{`Q*1_?z(o{(UV6D;_y8WU(Lo!4lco zI_2;G|JDcj+t+e3F#K0(<u-O;Xzm4t-2cw46F`=31qa<$aFA{V2j*6AAa4Z)=F2ip z1_u6phnim~lz272U@kFhe!)?q>fuo$+Wdl<zcm~*G~WwS&+*b5&SrUO4`(yJGzN|7 zfz>pC`V}g0DW;baoD2*NzqCqqnvb(|g5$Zn{*U#)&b=Vl@b~@%4U&U(vV5Nl5_<U@ zG>G2{VrC!U;@@|w*M;LkCz${83<m>4=T?x<ULNFt7^{YEEJ&8WcM;fF5c~hjX<!3E zY-9sL{Fl{WQ#?yT8-8V!xHSCADUoRSRnFg<%)!9W2zC_%2Lr>)5RfwKoKi7osGtA? zG`3z^f-M4tj=)P@I9uVRB4|*b*~Y9?wxOEQq*UA)rnLdC^&dL}gN-p*fe~22QjjsA zQ3yy%czGA3Aceo>Du~YHZ#fI1^Z8qjg6LBImc1alg1==eh>qZIS<4Oz9#CrNZ3Shn z0RC-<0y@Ew{DQ+4Tt{@Zf>K^&iBfkjDC6~R1*N<fOMd_V-^J_<v9{#^f6J0T|No<? zX!`yC|4UzXNJ9CM!r%Xbk%57~r4ls2`y-gY{}Tg<3yS>a7mg(Y9v&qT9v&qe9v=Ly zlUNxT8V)HOZv`bqP`4A3`kTSQ>tG3v&fd9S{{H_D9@6TZ`vjC^TNi-xLazrC1H<uF zP+Wn=FJCTYVqo~*3JN9z4h9DPR?z4GG)h46)Cn3afJ>KhA*8y&`Jwse|5DbSpca4g zaTbU<0-z)XOO~B`L3Z=EY-C|zu>M!dy>N<<BSU8^NU$4B9&ZKZ7?3Ak*0V4$G{1=8 zZ@I<9z~JFgQmK8AzeWB3|NkIA&jU$fT2W%azuo;$Kn7^&uD2EB<$&H+P_Yp3!rK~D zYzed;D3L$j3d*h^OI{0ix&P?^D?AQX2NHy6gt+RZDGLKbH)v!6lC`Xll~{Lsuvnif zF@bmwlzjR3Gj#TX{7@n?Q~S`xA4s0~zzj+;AV0l)%FMv9a01-F0WS`Ln#eEDfyVNG z6!7=|21oc~&>-=TRQ{elVDWVRJ`+$=>qlluVe^l?5{>2``TVU5m>C$pfuo@T;%p8E z28NPEXlyVsFuV@!Hizfi7giRa#sz<i{;&W4A=(s5c+$FCK}j>MlkGJJgxSf42$+}4 zKmiO%K@cmrKz&QF!1sd;4WPuhk`WX%-Qg_F$2neJWn^F|6>RvGUYZI?PN0x{9cc+p zT6JulV7hTHD4{K8U|^`T?*^yK#$&OJpcbJLHv>Z#xX_O5Yz39ztp`d3AW_h{b-~~N z|GRIz=7Jau(r)|>6ek>=tsNjK_dlJjJ%9iIhi1zE;4+zi-=Y6tD<BaU@E>eUFIY!# zz<<*S8ApZ}j-Wx?{};OVf>M0*5t+v4pd41B0Le6^5>OL^|C^?OlnX(WM@Ba61?BSe zQW@)i$chp`ir&hDTHqHVBO9!BO9i2E!pOkj49R%GFPTB@EO2;$qOG$RR4Kn!X?{`6 z-?HrwIC-~pg5n%hH*8}BWlxX_bq2IJ7XX(Cng9O(?*iBBEP=;bul)W0-=L%Q>fitW zkGF#AA<zuNOHf<z`$16ahriVuWb$#AZwD1hBp@O4?Vv*m8~=XyKd)IpnP=u};coXo zAVKDtubGT5ArwhlU#l0dVX;0|EcpFK^CgDww-BC#W`+q24BfZ7f0QyA-);uSHA5{A zB-X&mL8=*C0)GdWL#Rok`#AUEQZ_}fqkBs~cZ0*{Ke$k7Jy6dEk}lEh2ItY4K>@+x zFP@k)Ff<=DX#Q#0ITxHjestfeV`Bz~W(S|&>%G0MpS6#<K^?}#z|aZS+_@E;Q4?Da zl(2W7Yp^sZ3HuMuyWL>&7^8v1Ydg<0OM?<N2M6nOrC+qc<<i9;uQk9079s;f3ar=c zo(&cZC9EK|Um<EC7B%k$6*3I`tudf%0?w=}97>E<f(ENfI3ZD``&wcJBaEZ{ntKIP zi6BHq0TO+nQ0oTQ+S+qL#hCV7P^3cgFi)xYe{kcj7o3rUvlLzwd<A#q{)3w!-Fv|m z5LmLe7nCwylzoL2034Ae(hy@<N`=CMvkV}HywHP~(7YE^WHCU(yCkjkKwVNdIN&-V z)y8(V|Gl6<56EKcb^Q|1+dAX#|Nm|QZZDpiLQC0F4NI_KiNgP_AW4Y%y}n;weEjnN zfAe0DZidLxt*>R8!L7IduZ1Bo5CBp6;?$S_|0AIdw;GsROF(W_fU0N$8FYlFc`vBE zU?>s(zZJxI!2xO{ECn$cBD=vYzAoktaIFkl0@B?Js=m9y6;juQmk+=G|Bt053n>u0 zegDMA8J~@QaqIQ}|0fSm5Yu*G5Z82IaMyHTSgPs3@KMu&;g6;RgOip6LxHvfLsm#e z1gKY<%EG{44C;OLy3T?2N{>UPpRydX6ym~ORI-6O5!T1~TR>B`i$QJRPSXimjtspW zp!(#s!7&FGhGvfc#~fI>Ix9GiIjArkb5P|v=Ag#aSz&R^!2~p=-^~ls*LV=5!}?&+ znKaAVbNnq_pw#Ai0c19)!`5xl8^O}cV%_QbWFJ`JzZ$0Qf5%-PfKt}$Xpnneyk-Tt zru9HcShw$kULNrLTPI^PE670#y%Rv%UTYz_s5yayp&>z~0p_IU1Pcb3n*^D!SsyC8 z^xyS?r7cK*&D_^)-C$O8>H~(>|8=?Du1~r-nt%Q;32XlOuOzUGc?DyM_X>_u?!f<| z4v--%o9@yF-N!)lM9<_8K4W7xflQ0JKIvxYWb0z?aAV0>z|X+Y>&6rCqD2ehc>Wg9 z`nCUV9RFP(I5)dKVX>@zP&3*1cK2tH38tW+>ShCVFStQ7j%*EnEDf)Vj=8Zkw%#sf z&H5JcnydS;2Y7_|z}JBPqBfw_5I>s#|1WWF{a<1q4tJYLr=2P&V4Ht1m4Zxhc+J`T zgSnKY!H<Ol;i`9<5LcC$|99hf&DG$?;&7Y|H2>(_{F|A-2h@T2503Evq81Mv7>p0R z7DVlBH=p?bBAE#`R0A4~HvVRPtW@^JUQl%jnx2IY!@7dn3rE1iu*}^K0<f-Tw=2iu z00l?boLb`>4N&U?G|p`d>MS-dz47P&e}>>JpWfCxfBydmtv2}l1XP29#5-Fxz_qCX zs9$%4r?XWD++YM1K%Kqdj^tEO)1h-Ns8Hzy7dDXIMq1C*AAkS<PwVM@1E%JJN|Cgl zR#3Mqt!F8yKuqgd3(A^v`oSe)w<}ApFU#>(kWGvXj0})wLT4|i<<{-_2hyrK-U@P* zI19sp<6y^vl5S_~lRy9e{}+vT;J}c@(0${-Xb5O&2H4>N|3w4938|E)^>!&o7Sjt~ zBL;@Z43G)`MSUJPfL7#qfFjuU4=8v4c@E0m;GvBFrl3H3p(O!s%a<_6{(q3g^nwqh zJ@(}$*nmg3D~It(YnHP&gd7=4gdLlI>K1+M^?2L-Q?Q&bi#H<na5u}@J3^qqXLb4i z|9=)=r1c5u1Ih=R4{*dDez8Cj)EX;g+u<PM$Z)v%0LS4My)Ypch!78SRN=)V(5SyJ zM_?z%izd)8Q}>4#d;b6b-)RsR3z|O6V6bptNcnFHT6qAP;p@y%5$MfP5zu}R92O2< z5@+c8$M|SKXX=apr9Zk||3HhOPS+p3t{+lBEh&b>-M$}EI(b1xM8?O*MRz}q4Fs7D zSxs=}3^-hx-$+2l7m7KIO+l$ByqoQq>wkvhu3td0(OWG5%2mAGek{!Ajd?6ytbF$W zf43h`w;Kn9KNG}v<@n~nlE&XE1}dU_1$skYbO!(Fj^+W)8u-3x{{62czSonXmnFK} zr%j~SrA?sI^+Pv9r|XZ_lO-bE*I%?4GB6x-{m<BXpvIxzz1#Ii_l@Qs|4Pp_)c$8E zQ32)de<i$dC#Zp}^yBFc13SU$g&2tM`UT>{!^d5}fPDP=WVbIzqh)e&?t@azX4@X{ zT(3d~h<?$m2&&3JL-hRJp&VI^LH|WT;>|}mx_x<Gs2hT(!7U?rN`x{XA#%C<#0xEm zaJTP|P7fY*Cry3|2^E-=nn8Tm58WOd-Pd32HDF-a1u7yegL(K{g8u*i4>k7mi>n3< z3@>FsNdYu96&7y%4KzZl3bN`)Wb6M@bxYO|1xJQ5`7p?2LvPy)W(Edph#+(GiT~Xn zKm%5%x{t@h$_J1kpa~!FjJYc-0|RKa4QQnek!Br6GYdNR9u095$Wc0$t~@0~nsyMw zG|;pc*ptQxr|DR_3J`1JUWkcVJQ)?B8u>D)yIsoB`mLn2*|tT?k%76?Ig90mBnxQ8 z3TXYn3v*-8SflF`(2~8dfEN)UZX`6jyx<0pvp-=dHUD4A@tP}(<pnD<Xyzm=i{Za% ziKZjNf6)X;i6izx24vNT|DrLVa^}UE-=OtEkuRqI`TzfLmO#b~kZWB3fQIHfW1nO( zzL*9ws5ACY7IS=O?E`CD&{~q(@b2#ipD}?KjW8dxlqhlOX87j7(_F$I@ZuC`m;qFe zG5>dc()?efMgy#@n}rRskizAG0|Qv(zX{umzyJRKj|B5NW!T(b&x82~wg`q1>?+0= z=1d^pfOC2<XbiF2ji>uW!$W4{+YLXNN*z{mFfuTdSa!Q{gm>F%|7iVRrxP9!_9F4; z|NoHzFP^)A@(GXi@lyV7H=dRQmHf>Q{&u?Yyk>9q<56fn{Xf3jjiWh@g`txzuKO@- z_!4AI>$g(Quos}xEAq8|*ozua3D<g{gths^|JU-M@mdE4h7ysm7e9W07C%M1GB8Ab zzY!^Y06M^%C6ciN6rA6F{r?YYZawL&y_3cG!Ug1+&e}hqB~A~l!HaYFdz%>;Ai>hh zvcb}#Bn}#&VF6(;B=3Ue6pSx9b%y={hgCPrhHej@ZwH%8^esa<N(BR6c!6973Us;u zu1{V|TGn!uihMiB1d0!Rs8lI4r|X^0+CMKqeLA<-Eyn-5OCNxZ`){%#?1d88lEbhF z5CSJC4#sZRCne0?u6JIP{{p2C#usZDKrxZU_(C3J?&0qLpp3ddLcx)t+2*T{2xwkJ zu9xMjhlnFXrv<pZ@!z2NxWtQE&~hKpxI2$q^FNiEOU4Hr;^PiCtAJI4+7}<Y{|9%= zf>KA=K9KJ4ZoAh1CBn^hEQ}?*;r}m(zqs({|Nmw+hREh)9F6}nL>(Dw?toRsgJ%Uf zK`Kj`1O8t|$UlpVhE!DDt{neOj)IK+FA7=7lf{$q02DV-KS6Qh-dX#^__n1iD65o8 zyx1biz>p>Pf=L24trPGV6b0R-9K9xB2V2UOuyh}PotGu?f)h0N(fz~vcPamigFpWN zKh6MJAZvW!bzm0Pi%3vtb;ka&lq=N%2S)gd5>OXCvh_fzc=(HdAiXcT;kr6wpS<So zw0q4S{^Bu63Kko%?C|LaC=$3{Xh6e0wEGRH<<$%ETC*KPsc^sxC6Hw6fl`hv!51!% zKr=jMkfl#?v4^vGG8n!&FuX|l@&A9fFNg7e>+@xLSq~zNFMa=L?aCv4z@b$B#qaMh zUxb6ei{|g3PMe7FftOc7J^J;&Jl!8VOF68+mogiFb2Gl(8T+L9--Gf@Si$Ape2l;O z*@w<j(CoK0Yk`&{L%Det%L^Zn!#ZpKfQn5IGe~I$^I<$_@Fw<&_5BjT|D_z^!7tcu zgDmB-zF(Rcmc;=p#8N<wq8rxtOMNVD8#EmmN{qu^OacvOv>xDZEdo_Qt^%N*MZkZU z7hbx8#^V2Xm-1w>yZ{ZNL>{)jU&`AJQdhzTiLCC!FJ^rI|Nn4k_nYQ7ES<G~x@$pI z=)srlY5eaGyyk!|jGd6iU(cS#U+*peA{0P`0f=w_5dk0~0Ynt^?gx$0c$Qx1uKm;f zG!|m40LWNZj+xy*jDKnWYJScSqFVo#+I0I0bYE<KRNoo;#rjl<koKv-fEUG}*_0z3 zpd}EYUs^AfxH7v6Xdmiy{b78dyY@%7@0ZW3x?MS5>wUl9d|aTj_5(<mqucibNccmy zFGqK%0P_j$3qe^7fiLR*g98#|7Q{JOJQ)h0G?4J^|9{Z@a~i+K!Q-w^K+UAr%Am<O zhHeI1RtAOxC0w?$Ad1=ez+q_Pzd7{@12oD&YZQ~d{r?ZiV9jqNj1L5Ny8h{O{nF|B zBX~|k_X$%51_g$IxpShlFP6v$&NV*3zX&87`=T@SO{eb%@N#qhMV+C4I$eK6e|P-@ z+QU`C_af&1|No#u*7$$}s2q(xdHBW5|Ns9l2CZ{5J^-;U5L^ow-wwC_T*7J@%TuoK z!u9L_|5;*@;1wX<A3Hf-oB{W~MY@l@JPS%(t^&sYtq+$-b}?8TE)mXRinpxg;co-Y ztaq@v9b>a{>-H7tK4^Wq#KA(c#O5_KDDpyi+&gRkSpO=n>=Nh@b91neD18wS_~MNN z149=>WTcILiGWQ^36HyVEl+V6c!vmBo2!KN;S!<O5OKRMjt)Ms)(_pTpyfyET^v@Y zOB5S^>Xk@<b;=xL({qEW7C@*5$(0FqyK;0$yvX?S|9_U!OS%95|98kCuP_3yzu^F_ zzj=21|9}2%t~}koU%Em?T0$6QOXa|G>q6bWAG$k1D{uI>vp6cd3V=ctw64qefCIJ_ zI9V*9b{EJ0QXX))Hy;szPUt};vKU@8g3}aSoB_V<4V1N?+JmZF5vV3e$8PZkB}ax% z-ZdanbOnf%T>>Ia7l26HIZBQUX+5GRz!dKuFeN(!OtDS@Q>qidlx~lbBg342)&ok8 zpuG``w}5Gu#XFQ78G2ng79RoeTOa)S|Nl5EgOVcysLQqxB)NEtq9em`))k7544j~T z8tWQGkSugveJ8jBx3C2~_6_Q8Li%lse<*_1D8E>*!oUy-TFL?H!ev|mFKz*K;F@hg z3K&W`vKU`<gVbbz%tq<Kojk0&gqeY%M5*}&ONn^%3*HhQj}lOZ+QGuYz;Jkn5SV1) z0I>x@Y*2;T{UL*q5i~;6>n0N(@Z$H?|No5-@NYlSeXz5R1vIBz$8+$Z0QbS(I)T-z zSMSUabz}hTCvcO|KDQsFu}g%pL%_km^m}icEF%NMKG29>mk39PfP-J@_ju?khQ>EC ztWfWRd)&d{y{#{P{r?~Ezl`O-XvPBvhW#LYtq1s9euEcRceJpARwz4IA20gS)%xz& z|NqBYK>`Xb2TJsM=f3|1N`EK#w=r9vC>PT{=n&95g%>2Br4aPO;wrcha_(YwZaGkT zBa7jG8BcHPpI`s~|1V<+2=4_O6aZehQR&LSV0=6He;G?}D`<&GI9xjXe;H5kizsJM z@^XPH`1AiiLIHSI1+2&vtVjhEYCWzXYrY+1Ea7YLVUrc;>R|;L`&tmxJ`x29DS(9j z{Quw4!v+ej*Br-MzzhbESNFXRgM{Mo)+fLI|DO-4O-^cp+1*n?BE2nqAYIHCdZQGY ze@mA0H2Cnz3Upm;IHd5JzxkJBIUh(sq3dG9D}@e$*UZNl7#yw77aanP-GMsy@;5-8 z`z)Re2T-AW`osVKFJ^Fo`V<SntM=RrN@Sbsa~Mj*yUR0Lzm;-iDZI$L_5Xil_puj` zKY*G8ye~d~2aQCg{$c1Y&*&_DVr>du+Gp1Ktwbv9zi0uZ;m;3gGnKH1y=eaoYITDY zb-HJCgH?ByJ_-9Tn)AQ`R=mGp1uf|9>n?qg#rtB%xBvg4Yqgu-2m~A74hEGtCD;G| z@02~G;>gha?_a6haaIr$RE_)>t$5(TU=jPL#1*=@@3l?yzrUqI$Vy5cI551v-Tdzl zXsO?aZU+{G<m)3Kz3kntKbjK?{&pXOEvIaLqW~T=fTUOGa)NO1+Jo*N#@{+?IjsMc z@^v46u^rTZIq-5WBLf3yh0FoV9Wx|B>#HV$)={}WX+B_J3)=8m^t|!^i@%_mq5?(+ zhQ|Ld!R!>!G}rdy0slp7z#+%q5(L^0;`$;W9Fi|US;Cl+fdQOJd!1!Ky|GLG{~KR& zYCgi#S<TW}%wrk)g1_wtXg^-<I|lxi^Puf`rSH4=T2At}90E0>wz>W1-*)olG6oc5 z1TTS_Wlx%q@MNDf=q!EEyK#l2BghM{wYuCGTMm?H@NcsNt@RM<c74#*Fh$alfy2dG zmVcWYqr3HwvRB=;9Byt6b_}H#yGx(^cYV-&jH9{s0ZV7;lcJa1$2+T8jyr>TN(?X3 zfB*lV#n$P})9WnI+c`(lks&Ir+t4ws)4<We!K?Ih_vaVafB*mga{Isk{~LUmWmz1o z50-s%b8D#k&%obm^8f$;UT3+T|3Dt(;BfFP{n_oz@<IsIm2~Fm4CZ*v+*!;4%6uof z4?;?+YEVh_dWEGaD2?#9M*RE#AJpylg^piKT?J<Xk&FaTCOG!?|Nmy+2mfF6vx721 zXYHLAphCGjKBK#o<3%ZGtk0Fh+L?vFB^(qDpq)@Jn%;x*#EsV5{4H*b3=BIvKy`k3 zM)&W}OPiG$f<YA%Xp$;2veWeesImA5Bwu>xe^~}RhX{7NW!QoWQ_zy8<PZP<M|Q?# z1b5qla>f7a-`onA_*-9rCb?KaIg^pU^)6_QHSdcO@I(M8`#G~LzN6yE(Cy5z_yL&a zS^PxBk-_*tr|XmEAFQ<kY27}~0%@H*t`}4s85~}}0L$2d%IsR+E*}Y*j*bp-ki<)f z1gHS673k`b0F^Ku9TOx#a?k#Qb1dB1!V5t;8Sd~^pn&L<1&Ia!zkVDttp5Tu&Gy<L zi}%IbPoS*)S`{?jqR{vo;@#jEB_Lfd7~g=J&7ci7uUSCD;oYteUevw$|Nn5a?FP^y z$5NrJzc0c-efHz5AOTQjhc(H-Ewb*mJ)pYccDVK7l6+eaSx1JFjPAA#3=9m`hfCrt zB}${Z+dx~StPhunTS|a>E5G0U|Nnm*NY{(mj-WB=?zSxu<xmB;5DHAe3jS{cnfKxl zLVWu>aPO=Qv}N1+aEXhhM5#k}+Ytr^23=4R4R|r_-T(jHZD$x57{E<)?c)J2n!!RB zKx@m72fQc+8wS$<A`7(W>WDz^zAK;<!fx9k<H%4VZaD+ws#5-d7t;0&4FAnvID_r% ztqVBr$^lxK&{+Rtf|MgeiC{Oo_2Ck3ONmnUfERKgMV9e@N`$)ISrEePAmQfY0{?wE zN{@%V`0@7t|Hydwx~br>Zc|W_3-7Mw2>*YryB*|RP<t%^!~umKoC9(boC9(_l+zmz zcUCpTS)AR>P`T#nKcF>H&Y*Ea=79g#nh%5Bajm-@<Y88jkpcg&A)EtpM(cn67SI3% z$Z4SJWWbyi7u|h4KK5|y{}OZ1zP_+-1MBZ48sVK5FAjoIW$U*R>97}|9$&K^Lu4s` z<G&f8IAITa5eZtC*?m0ju<-#<C%6Gr%*4O^|NjMOb8`0wNL}kzP@>dam%~sZ^FkD~ zRj(iiTH*e^1S(vPy(oGKs&IK;G=T~SP~WN7EvMTSw95WPCTP^#^$ALTJDA1uq85~~ zx=Wux`YmDqO<SZL8M;jyKufN#wH_!@T-YG($N(C;5f6Y!{=fGBLhFGNj_wA~7LC{H z`$`@=FoeODQ<rjwy|4p0r}aRIL`KSE@LU0OWi@EE{r?M{uAq)1sI$-Tq8-%bCdcYO zjG*m2m{uRY`2Rm>6h|Us0zRw%i?%#)U;u9tfO`4AD9Fp*A6mbaO8++%P<3Q@kqUBL z_XoIw4p8U*SlnTFh=>LJH<bXXv<9jCf1#Nd6juKif`SkfVtfJrMSC7NFf{XmME<|r z_4fb&ES`)7pvY}{{{KIk^V!2*uz;N3>H4I*l;gNt%!HQ?495T6JL^PR50t1t0<&8d z6qx@ncea5-AMDHjrB6V7P>^)i6&z~=b)}q-wRwY<OdNO102QHGyf5;=nL70k1Gq{7 zWnfrZume>SJTH7f3c#ZPJe_VipaGhNpp?_;mh-<X=LKk_6F!_P3fhXm`uzX@!^Z#J zyGuE;cwd-;3W>v6JTG*>3{W=#GKBlz6ci}kKVD1(jm=*Ghp=A;XxcW5@x{g$|NnP? zh>UFgR$>(fQTg9g1Qev8buN+MgeH;25cc9IDEmbI7o7qMPCu6aoouf;!(PO_{Qp1F z_*?jY(FqS6z<csR1AZ^+K?5zInB>S3c=7N&IB&!q&f>^80Sb8z&^!icD4V|p)B@^u zQvoey2zVg~GOXK82f|~9@Jt}QuP;D`xY<B>&mlYq2=69@=K|rKhVVQfyuA=!j4dcC zLDlvekU$piiwAFDP2#$Y*8e3^;qdB`zwtjP#!A@3U(|yX!(u5M5=+ZL8jrhzBAcPR zE~oW>iE{Xh&%gfvkF*A7^b(QA|KLJ}r`evNls){#{~!PV!y`@(v_<ZPI>_7?u228} z2ju{8^p(8^RlA_5<av<=VgC;c$4sEf=Rg7R161I~fo7phL8&q0z+(r7@c-8`wt(ox zJgSZi|F31N0CPY&>HoEi1z-*+X8&JnwgstR=r#pqsKuZRR3g@F3sT5X!rN>MQp5n> zu&J^TlqVO1WEO(*(Q#Ig#wq>|44vRa0@e%3%8Nlctog@({uWRz3dz6$|F40X!n;9< zb?Sxx|NonUw7(Gk4Pt@}1-tYGGnfyu6>JkYFd_MRF-Y*m<6oe@p#a#j7i(Vr2MzwD zW^@EPFhC8o1r3G%zpxmT&OzDU1D3ikgQlk-soMlKb#p<qv>qst2Bq%jATCPkHa_6+ zn*GJ3-=Ll~tVax*L;PPV(Cho+#mrOx|98i7^g1)zg4$r^{N1iEAiJ0Nx3fgNF71rv zI9SWU(d+smpxc!LJl`JhVmW9vIH+(G>T>1CV(M`H(GmOenCmZw$k$xPCp%()9CQ82 z;Mnc@B8%~Vfyn;?7SNv1z+TrM0lgrxfERUU3=GXj6hNC;EL^{ouy?zD0Cj+j54;xP z-|qTH*_EfE_6vB&)CbUxDOk5C5VU$c>_zbd&>DN5Za1FD6-}k$FH9bR8grnbWAHS` ziT^M485tN>IF#_dkOWI9fqHn4gN<*mU@Q^qjAL0Lz~9miYV`PVG(Y&)$=B%yGOYQ* z`{ol&oo+mxaV(v&e^!E*!|S}rIs6~8c)o<^MFN-&S~$-O8a3h&08dVrvWLBpa{x_= zxbc8`9pU^fpm9;qhBLcf55`WuZa)d_AD-5~JN;PdWWzzb-d@;1_MUXQ{(0@&d_tkq zjR!Q<QrYdx16q(F4O);P)_t(~fqeJHgTEk4uc6zvp}VnJ6iP(0n1X`?Uv$|qFeo2t zJ|X~0GOFEf99_N~9UQO4jQ_ib_quX`tvd_e+`-f7`p2^NPYEY9oL+<KPjH;ZN5?_8 zr3D5CcgJ#o<~l$VIe)BW{&s-&)^UQy2b=$k7rkr#FV5dw&d9)!#r)zH$k)w382MXF zAOa^r0<8y1d7Eu}gd7<d`CFtx9nRmNP6&UCBd8No@X~={w+J%>L-2kDRY!*K7ZWT% zi2-z02`^|hMc9ig_dxkX1bkx3K1)^5K5&L(thQ>73=EKSA6gHTs%1pHbYRH%%>-Jq z=m$4}AGS1p0>q547ti?^7#t#-f7p~+guS>0S}_04n)z53^G*{DM}~}$mktctCjtXr zgn`zu9RXF3g2vw<&hUj8@tVo_TSmZ32ZrGA7X{#Si{w;Ih?;KKKmSdR_DDN|6nUd7 zVu2{i5Kv%b$k2G{z!3hz!Vc``*G5@i{zF!{+_1h^qSE~Pe~Ek+130Ic`~{i!-|U4d z9|J>Vz<;yg|DrQMl@n-NUKaC<IMDu%<{ykDqFKx@0zsVC1EuoNa4!|h00sFA&42&@ zgLkdHkpBnjIzU=Tfx%(n&<#<izJbax(B3N0R;xcRc721?qt@T~n?McW?t9wzd!1RD zf3Oslhrckj2X#|>omnESe-wM{0If%|{!z@-eVqBY_3<M9fd8d`UKBqBS=4%<RIJxs z!1{QR16VW`Dq3QA@HbOHugQ!TSHJ%MAGsK`)eF>RJ^mFmJKKDWCG5o>umspit{joC znc$<qVOcC$3NMa70J$*i#Z<`pIIszeL8@E7m9l0@M8q9#R$~C|$Oj#=0IH@F@BRP( zV!{c?9016!AE2P<L^NSRB?oAbzxLk$|A$}XpZE_Q>IbRa{{R1f&|0MLHzGYi1HEB8 z9(-|N*asrQyMI_8E9UQJZ-wmCJI-SLujnJVj1AlI0;CE=;8PWD{J(d*gN!4?f3p|I zK!f<lSt2{xn*VDQy@-!H3|a5d?aKk(LB&|Y0@_{I?P$Y%u+aj%d+NRMCFuSs4+;J$ zhq@1e*P@`T7XeL&c-SzX;NR{j5*)_Ay^ziLQh2WmheYeQGU@JGo^B5w>z_rO-4Ptj zH?4mcaXB>~(6GK%^a32}D8@nDll3n{;JX6@WWCEm(8`Sf&^bl$MJ_*#j|RY3v~;Gv zI1ZlfV1Vq7(gF{sgF0lP-L4$EpdC{I5Sak53`gsM66<aUm4h$jzh7v6zzA)!bR(^c z0WXU=44S>+=w>v&1fIVEdmU+ml<@&f9a$V12HzbRUIgFy|Nn&oD3v=@v>qrC19fix zUwF+9o%ey-_~N?_1H+4)JOBS5&ajPkV0fVp8cAFXDl-m4^H5;ei-fPBq}cimG7{4r z7PGKK26Tc%El2mMU`xvqzU~{@w|SZm@-W}BK3()K`v4E~A?p*x9F~@)EZqk|DZBMR z30HRnM`!GxR>;;`&<J$%Z`M*C(9%BR0}d}i<1o#?8Tni8fh(+pPTwEhzC4|N3Edtn z%|AK#TS5KgZr%(TM}}_O91wYt`KR^uT9xdRJl%CM%_)`~4BfV1X<3l86Z8G%gFM!k zYaVsS{^@4uu1m4)V_-N?%6Z%^1(e}m$JtJR@f$()rl0LZ7{3L?x3irL<F|tNdbYhV zeiMi<XWI|sw}JS4wv#}7_Tz3TU7%6PvXm^2|Cb{>>r!5`gFG4d|8lqMkH}89gys|f zqvK)q5NO$)g@z-;VjB?Q03uv8KnuCRYa>9Znimw<VU__bCH&nVv%m2$mvS^8;ITed z^d|cx53?^vob|zCR**CkDBJuu1)1^U)<;nDG)o~P0F)TqZh_{+A=^H?V>z0CbJzQn zh;|>&Vv5v0SfZqTu!KYVU`dMh!BUqO#h*b3;efZJmVy@fy-WnnIDnkE5JbFA_+K8= zefb4wA5`~;=3^Y)Y_Frb4>!NyFR^KU!B(Q}Q6lrA>n5nB0vdLL)l&jD!FAp1b^Ach zTL>avi|qsXc_D~+&9x8Y>xCc!I&~TFLhK``{qrEw_&{^*14jOq8=#W`TpyIOXEDDx zboBp!OV=l$9>TE)pgzrkPS-!pzd1^{ntyYbur~i@DV6T_Pw4c$(&?Vi{F|fHq1!*D z)Az!0_mm#cN{HVarFxLm)aiStn-`Q~x<x^$hxwGH@10u7Zr?kggcTms=_1JS-}TPx z+b`-qfQoKd#sT%{K<3K-FHZ^nANnBjwPbfJM|bTF&<4j6jx2^3A@@O10G2~_m|(Xn z%vEgNt`|DpQ;ZM1cyR+(9D`DX4@weP9D&M>0duniG73PEn|T9P<b#%0{TE&EzyWj+ z&1-#7;lTh}&i26gq^&pu!vX#&2fGh~%8$m{2OxeaM-~U9Cx|u;9F5|b1h94B^!VQt z#CcHz8UtxPP{I$|YJCCJLS{8S;1GKllmNl%K<SpD(E_~6O{=*=fVotq+d;%ufpxNE ziKwk2h~l$V0#WR?3=T6vTW_7gP50PCEDRa@;z7I3L34B9vB<D+<NubnpyA0<))&sN z|Nrkc1#NBx)r0$z9y>5}vDqk;bATqTTK|`**eI298lP<a5Ay6!{%r>WUI>8JdbA!W zVRUnQec48#oZYR9t>r-JSJ07k@PSa)7cXD^{~y+E3fe6jZVcLrC;{4CxPXCy!N#_P z(LL-%3ux7HZwVVCSo^Ci7WeQMiZ?;IB{H(pRzks%q4j^sX^08IubskP1cO$&-EeNO zvyCh<%wi0F@%aX*&Cm&|N&Uit176hXftyF5kc4HF{a3&lrTI7u^Jmb&|IYtl7rj^l z%0Q|h$1yakGaP4Kq79kuG(Hd+9Upi2zbVN67j<A&ASMH-o&5wH8K9FXf{hP^b+UJV z>JH^O4jP?iuyo}p;RKZht{g0#!kw;v8tjxx1&j|^y8hX$#6RVL8>q={^Pj!-QVB;F zTL+U<XDCmX9RIe%0d6n$gBm%l2TFwhvxByqmT-0Z@^rENcjf6|bn6b~>Gl<9xm{w^ zT>FQibY;VDg%Z|=-<+lMTQ8Nc9CP~50IG=^>=^i4UNSI%<F16ohO?B-?e%BB*N?#x zph4Vb&^B65&^bUL2MYXWG`{U@eDXDun`47rOvz7>Yt_CTWGs~jSyRH(>&Dn%p;XG! z{oysQ@d4x8macz5r}w%3x%jg6WQmX`*m9;Ar~mA&Crdwq{KD39pd=Kexs=03p~TyU zv&6mic8M+jz5@ZRmr9gh+yWIVtp`eYyV$yYc_5zq&yMivYu*>zp-PzD{<HsQ?+)d0 zdl?2=>u{-r{TLGiD8xV-1YYuihF4rU;-Wz#w#^C*{~4j3kmff$;1gslWud7%^~L}H zkp4i1h9g5*aEELTck6u5<;MBizuq2LG_duQ)-{bM0f%G_D{r#tiys3jd7+*|wQ z1s7<^u<MWJBRsbM|Nply_UiWi(){y(u~YYtgU^|IS@^9F7MTUSP`L)G(j%=umuNz@ zGye+@0~v4<w7&^#fX8CckzSpqpyR!a54;8~>qMM{vamqYkpblXux`^W4;&c6jc*(O zw?15|_x~Db?NkZRaaNED(1gNkWyru*^N)&Bt}LdA#UP2-tPm4^F!Hy8>R-@uD~Q%o z(9s*9BVoIbr&-FE@Hsf7SxS`tgixQlO*cGn038dWeLVQ$4~Ky8;NVWzFaNJ~y8f^} zT%sTF!s{w%p2zi%_2Cl5;NbtIKLY-jehCi_290fij%)h!BJvtYMeLvM*gxU_Mc04^ zDG$GnY5u`f!eV{6wCTU-3XsqT>(BfxpcP0KawS}#g(AN}#5e6@4gsC6KVCe(0?zo> zze{<-{);Yo;J^T0nDoE&M_BlaRghjUR06ax6xOu|WiXB`(8-b+pxsdc|3!CzHtU0y zskI&`WdaqU4vRs{ML~`5P|)%v0q_iIbLtOp#t9DJ@Au4M_ioV1$kxY8cv}ybaDKnA z7_`vgbwU^@8T=PL19E=pALG&=|3y!L*7|>d3<DZ}_%C_{%m*Fi@?Z1-NS*5!W7iMH zAFRKZvhVYM=CJ!UckAa;_U>Z`9|&-N=rjebGyZ<9(-dSuTs+Jdpltc$Un&2Kg%?2; zJ*Z;=D*D5WzgZuv;jjkp<0z7O(R}g$|1c0Z&Hz&Kg8L%4Y%@OaTB`d5WV3ZQWb?<t z2W<TNTo_rJA2`It9)|e%1f%guOV$caM+Q()eh{%j9CUWp_k-Y5rBu2Yn-7BKQT-qS zrSCzr+zin5T~Ml<5qyLc^Z=>mgV5unUUWPDX*p10)bgZ6WhM9kDdCl%hFb~K>$AO% z|3S8BA3WUa_z%wd3upa-vcTmlXa*fLVq<(eyt`Jw`g5s>_3ttP$O$z}of5_eUV<8& z5I%D=$A8dboB#D?(l3%PfL1uc&n9|v9vnQ~$6km1FO>jI$Uolx|9`jZ2g?W%{?<7R z3=C=At|B`@dqL8y50;r(e=gy-{$0i$9vt>!#b%IRo)-caKoOz^8o^_|@c(}|c+wtr zA`dwCT7NDvvi@DJ^Wy1w&=MrL?RgN}En@%hw^V`)EbwIg%UsYBB{qob*^Yw-&p>AK zx2Phikp#^j`|<<^hlgb`_WFth26x8t{4ZenFS_A@1E{nTv5e*6Z;b<K@#U~SU9z{6 z@%2tvsZhn=3fi;)%5R`;D%QXG+v5NK{}1xk#Z6#uz4Qm^1T94etz-fnH2_`xUGonl z4_lf9UOUAD3b<9<{)5&|ftJuAR!XTdG%zq=T_6QM1P8Q<7<3NNnK00CtK0`lHM)IN z1iD>RctDFOyKjKbCHwxd`$PBP?<pz*-6y(_foSH7uid*(bjPR&fRA-^QQ^4w^5X4_ zuP)x;K3V$Z`{(Wt-&0gXx=(;MOMHLEe6fhnIz)x1oTG@}+C_z<jMGosMMXe5L`B5- zwzi83hjfSv&-Yv3Z#3Ux=swkbx%(!_p14B-49%(ypsfO+To4=<-W>vVnF#1e($JuQ zz`%?RnecrX;Ot|3q|-%(Bc)Rn)OGE4Q8DO_;OO>I(J_|nF5qeY_pijdJ4D5#`PaV^ z7VA%Cdc7uPy)l~wy16?&c$%wO7)sB87ejPAbG%?OWMBZFvI^pe7&0)t-jLD{&SuR= zB;r8}a(z@-zB{sjCQZRh085NPLDlWSVSM6+(ANL|L%TC1{ul84FA(@&Ao9Wv+ymx` z1*-{B5$I&v0m{mUL&2w5YW^>j`ClmUzfj|aC{*Dg7KYHU@Zj!OpnBc-lJPg=|Nk#W zgZCA@>i*b$FpKd;yaDJS4&&R#Cyg%||Ns9iwEInPSa=pg7DGmOmIFiJi|K(34B#2i z(C!=+j-bH*B`P8>wty24PwXKM&_R_GKy7K+v!J&06Nc_m4r^2JI#;DEmKP~kpmPsl zFA}*?m$`z<HPD!f=2_50BFl^T%b-R-xL5$KH*fy;fWI9ydJr7mZ3|lK+H4Cd>KRHU zUMPa*w&Y&qzlM!m?cD}y94-VE{>?uaOZi&Am9TUld(CWoz#-tZ3~0+2ci4+y(8L*N z(5dxXDWe-?T`poz!1eAMt+z|{vUuVwS;4DmML}abPN3xspf+ZADaXs||NsBLcy$`I zqvyqAFcsf@IQq3n*b8ZpvKQx1g9;GHif7Q2qd>+6P{6R90gs=z-Y(_)U&`}B8sv<Z zXFwAgrJz#}d4gXsgQksMZU=1+gY0+UZ=K8tTJzRf3tCOg-`)ipI%Rnw4ho^p+CRZB z%)ra$T_1qf_s#<?5rBlaC#YpC0Y0`1Gy=&AT0?Cb_To7wB;>7+m#B9;|M9RsR>ahO zEFk!Q>5~^$Dhv$4FP?!`2f0274tT)>I>X?I1n9&g59{xxY{uW*I!k#Vq19Q+0~!?s zMZ<qlP?U7KKCwPtqJVDZGi3(QDw78<_Jh21L<H9H(*t!MYacL_8X`pj$k1TK){H9; z92mNPycX&%<>`*)$YOcn0h*>f++F*m^*?{>eo#Lavf5cE?8Oq$`VG(mmP`Ns|9=s1 z>i>Vs+6SdM-S7<^zfXdiD{QahL3%+o$qQ|WqLPf`;HBxW3&Ac4!*D?B|I#pMLNEz? zVGXgUM85gogR-+>FSJ4Y7xzyh;`>GNDbUE^nUnwjzXWZKX#HO*_F~^jP)iX~RtLPu zI|=FpM|K~7eF>b%yL~||SnJbe8d(pFFGYYBoeLDpyy!gn|37%)F2sc|1W$s?Y2yR0 z9r@S$3WSAsf3%F{DB%Vr&l8}Xi`_Rs2k^b<1vNf@L`Js$FA=f6S1h3YIV_8T`F`+= z6Kg;Q@PM0A(56v0Z-$m5!@?XbM~3W^BFraV3wDQcXb12#{sP?qP{i4MK*aiB(Q8n{ z1nku2Hv*uQ)Q$q6x;ni3pLQir^RYh%-}85$&pgQjI@z~}(FK%*d_Q#ad3O5#`F4<z zzx6T`14D4HjA6HMXXuyius@xlKe|J|bjI?0JH%L8a_|?6SMx9XGUhD%sBUi-Yj2KH zC(!g+L-Q|%V#)4PmtXh#FtL2UtQfPy<sWCMa<?ysqU39tUatpmnK?T^>stPCma>5) zBU!p*dAfr+x}#aTeg81~e(8*20d=XOSh|BaI)gbnegA-FN|0=g{n7lGu`~7ye``Nz z?Mvy8?${p(f3sxScb4*a$64PiW9q)g?E3?vtJC+7^|dml?rYY!O5#B0%N4R%7jl$Z z?*lFTYW}TIEZ%+k^1JWX6iarv{PSUEDOChH%J8*RulED6_!fw3K~iA%7P5d%;pp~c z0Uc53%hO%R((TF7>BrGs%JZ5T)WNL%!cfX#eG58S<oltQ=VEsxOQ#=4XB<msAxpO( zOJ^ZRw;zkOA4h3Imk$$5hcExXgB?ChETBMCZK&mEDCO%u1rFBBue*IYI3>YsaOk@1 zaN(4AtqE2n(ChU8ECW#$$<pifU>C?^mtXa^fZfe0(CzxCldaRm;7_;fhyNV>t)D@= zbZRs~N9#fcn7Vmuv_R`Q_B?Q4$N*hyaquBOvj@*^P}?Cm@c%W4{6dfxsM(wW9AIv@ zg8)Rbc}WK-N*Q3H|2&)_Ob>yEN@s>r&gKM`e_)a33XcD!si1sY!1MnaSm=L&0HPcL zZSjI8bC8AECq=qNLFrxlM6ZwFo4{TVk-&f#Z$W3hxpFig;rS2F5!S3AwPh^Lxf~+k z+_AU><Re#(#USxcTaf?2<Btm~v>X}2x=lgZDBSqJ^@mcE<^uxR2Sft?n}Tc!hi%dT z6=&AR!G~&9G_!(q2|#o$1}V$_Cc+F>pK-*IfdO@EN2i;B_3@J9Su7b03ZT=?83aJb z6W#!gP`QEjZwdV`6M$O-^6l%{&3+vJJMB8_SpKtu9M<h7(9H3_`xtn>A+-BVU?4aX za|DNV7Yc+M-+s-^e89Q&K<&@&!<h%bxwypul#8?MJ6(T7bvkf#I<Pb!;P5K_lEu>f z8{FwS_?(})k|zTcqv8KWL5=~f-2e^tfHn{GPG=}!VCW3}WBse#x%-s%`GYTcdff#a zn>~K~Z|-=*&%p4%cfucj28K?7-U)x+|Nnp7;m-#UH-P1M!wY@}1`vl8)VcF4J>4Dp zr`z=hD`@3OuRl+x2TP|TN3R!8rw2!;BTIA2JQwhCl|A!7>7~ofx$DHggDnR@I|Tfk zOPM(<SiniF`}E~k-!CZ!aC9FAx8R|r84oxh1VGF51j0cx9M`o2d76)jAAH5%eG08a z`_k?Ir}^0jPwS7pHI{$6<vV=^I%EIv_k}VtFnl}A$lnUu)XjX;`ZIsOHK<be{d4dq zi)W|rkLI8DWo%jYk)YxDcoyq;j#6iE7Hj^gP%H(?XFqy<7{LYH1W*B|1}ZKjU&}Wi ze1I%DX9CEBNM)QqM|V6+XCzCvKTCH#M`tBRx37TqIY!?<paB{FzNMf!fZ9LZzB~v2 zv-tP=82)Mg4=!ZmyJNrf%KYw(73huz>yH)ajO6I_W&xEb-W=VLEY^`6rQuyZ>?|F= z!k|)wou&D|La|IktuUw*IS+O`$Y~s$lD#eyT)NM{RshQh^!lR}9xY%;_xi)i5KaM5 zLG1gd*Tv{hCr76b<Db{e-Jzh7r%tCooi0W{UfO`#I|p7`fYuxLg68JCV|g@71$zA$ zJH7w(#u)$UE)_WVkHxPumZ#JEPxC*pm*T#;{$b>A1<$0H{sBqDB)a`sto`8?%0Ezr za_;i$-V!!gc=I7D6hCl<0+zuD>{y;|e~#{QaA8}{(e2LyDsM{#m`ne3Lfiwl(DzF( z&&TdcmQHUD(6Z-9mTqsB&PWbu%@*F}!v-sy*;tzYfrAxXIG+PGX&NrS2Nlki;9xxm z3RZpwkmnyDNmjD-LW9*0DOg<vI+;6NB>sT65W>b7n%{^l1Q!6l9N7m%m{~zZP4hwV z=7%3TeLo!h$r9|@{8J$;yq3H9-2cn(ntgx#f6d!`@Imvb|Hj`gzXDa$yx?;0=4-+3 zV3uxc<<K9>|G2N0ay1_o>5S#DzESkT`bKGew=BqD9BOVBy|BJn8vUB5xtfCkN#_Ua z8>NO&ot!9gH;X=4-z*h<u>f?Pz>UsW4(NOrC#V_m!V0u(rQ2Jeld;=bpxNSo$<t0* zup^xXx&=Bz|1|&lUn0`o15S9|H4|KveL-$MU#bZjGwlWo_j<T=Tf+Rp_uutT_e9Wi zRr5iX*Uv$v4Q9^wnc!mlU-?|A5Y%90-yc~D@voVgPrA3Bto_;T`=vYNCrdY%w(p1T zkI?kj>HDLOIm<rI`a6FMXt=oBi^bZDqco=ZzXCW1)v9%$2j!way)_mr-!FH@zEO_p zaOsTcaQVkyYTWJnraP8Hk^8kyuRpjP_|w}1t`Z@t6(#@icgDUc<pxcd_`Xr}W`Q;o zelT=<adcO)bXKx-d$Dv^feHrx7SMsv-SCv@#nD;C(isR+&>6@9byplDWpe*J*!)kS z!-tKfR=J^;o1v5&ob<ZSU4GAL-Hk}3e>iJ8TtJNmZiZ6cUO!j@<*Wv^xqA0Noa*-g z+$g&Ij?=u`_ebl=67Ei}P9H%~ruY5PUHXCfA}C*Tb@~|n=`Q`!&DUGW*lE{#vQ)}i z7F5rc3U&Mbu?9CLO4*xLK|+vo;Cr1|5T!V%@a70N{@;B1zxDT0nHPck{{IJU(F}*4 zwQ+MVsM#yRefYK0H#eT<67#SZCl3ApAJ%>2#SsnAk`VtrppD9})j{(J0<8yXS({J) ze=XSUCS!fPge%}h-a$~`p-!f=jt5+M#Ddn!UI2CIjQ4?-<Ujdud;ok-xb=6?JqyQ6 zWnY}z3+fPn=I+1_c@YM2Li36LuX(<?@i>(5fDChe^1^K2|Nn=>UT`k}SyB5Z>;-7n zI}&NV0ceci_0{fDj<6SzAVrV~<sDC?7#LnyXd!P^>UQM`Gyc}uYVs6xe53`KG<f>| zzh$Wacr^GW8v}#&u~PLHE_=ZpSFOG9fklu*Uu@a~4kl0)zK@N8AsDp8x%>FRAFRF5 zgIw4k_Zu)D?}|`ix_#ky=T?oU|NnQ)Re$>bf5UGk&<q7*sX@1|!1s%wNd>hRxA*-2 zZ~U#(;Klwus8+c{ta|Cp#=!8+fkmN25OgRoXjqElMY1F~8bF<ztFOSzYWZ8{f-ZMq z`{u&V(!k#`fr)|PMK@^Z-66;Lq@{;QZ>!AH|DdU=fNr+`ChVQP3Qs|2j68tuQ%PWA zU@$&u2^KBkXt~Yb62Jsn9CQcNznlvWEwBN`2Rd7AK;h*oz~AP?3Oaep<tgZtE|C9P z4)C|8gYHJ*?gsnX_&~!?F3{viE6B2LHs<5a6&4I7qFn(d9id-3e7}ND*U4h)b^Q|X z+M9ph!GIUnK}#rG50qGS_k!%yKF#baV0^&A`UHR5Qc$O!skhbP>Hq)10WWMcKq0^b zURMY@anJdGE65?QrL!1=A<CNFb@{1)W=TARr)%wb%DcU>0L<FUX+4fd5-T;R4kS z8ASxGgXM3DVPRm%V(10?HXsb-#_m>7RCY7`H(`e?90Dz2)C8TO2e!Jq7nG2g4_a;o z1yE-zC~@)kh_Wy+H17rZpMk#xw3`%eW)>r|p~qam@S+%e0dz**UXW3Y{5|KH85sVz zg3SL9HWxh3Yr|N=V#8Fb$iLm#_+(o1KQ8_$2c4ap!H!|-+zRp^B$}ZLgZ_iXUZ|=v zFhr(VgF}+PH3MW1*ia^@J4-aPcq0Nj!SXMDfHo(>6<dSd0rDBdHQlZPmSFq%n|}WN z|No^rXze>+moUVY9U=TC-F%%c{1z|ym_g|almxyxfYRrFP-1Nb#c?M%B3f?qw}NJ3 zpsCAOfWJ+FnStRo8zd!l_kseVc_}E08MMJ^qqo)L>Hq)Mz5>OT-BUrb|G`n!CFI!f zi>p)s;=W@Hybh3r(IEh3H0}i%@?V&Nq3BTe4Tve)H$btX^Ys7!fMAFSB$ptf*$M1k zkP1d{SXm$D@38`lfvnaB`^4H+fWHZ}Q~jj^_((R8Jq^E^_**Z6hG9Tn@&z4V2=@|5 zzIiD~KZcjwx~GC=!C}k9zg@`DF|GL*SE*PtI1w;q@kXb0N;o()gZ<0|rP4YD92^?K zY33iue_M(7UlOP--iqqKD6kmF9Z3GO|NsC0OVIU?mLLz+fRyxtl%RMdi>bHO<LCeX zaiHk2f%t`gyAb16kV@urV6X5&{J?yS5u9HjWLl>H^D&4IR<JQJ6zvBs9n1&?T{+kL z;r0LjfxW#TbF~kG&!P<IJ{S;|0or;8&A2zL@A0=x2d&0t=mmQwp!=})v4GwdQ;_BW zEE%|jhj}Z=*VgyyPrv4Yj6Fe8zV*HOm~L?RLwpa((BL@c`v3p`Yx^vQ-d>Pa(De)d zw}O)Le*;*8DG}`k+uyttlnWUkdQr`9-V4e`45c~Ed%<c-bhB9FEWtUnROH2`ZJ@dl zH0Jwa*EUd1^x7Vpd-s6`Z(kci^98uPcPQcS2B*LV3n_5lS>;6$SicNtcBX3E|NqSj z;8}W}ZgAq&1}CEU=x)#%QE@MB%mweD6Ug`gs;*nMfo6g@nt%K&m40Cd(fdLfY#hir zpqdZVc{ToTeH=akr}#n?<VcGbzqi7i4XM(bw}Pw7*C)ZZAoa?C&tL2Q&<sBNtecyE zpN}C+^Fzjx{Q)m5K?MzHj|1~J7Xuc?5;4eaD4;4%?+3^fo=(>%uf<->fLrlm!Pfu( zJ1v@hpTLgxegSeJXpo#`+yDRI8<3horh*Qq5%}T2@M6VQxZi|d_`?kX`Dqn+^O^Nw zxSyn6=)o0$2N+*$+X8Zi$m<Ib&)A@PhM#|*4<Fbw#{ypDfG+gujQ!Ki{>_Drg|WmC z<c$YP;AN+xPr!9<DK|8=xq=R3k9}ep`=mtj#n~<3ZJeDPFE(s}1tm5QDsP2)a1qER zNP7n~I|#bbf}>RCMbQ@cuqe3Q@(Vm`Ct`fybrxt)()x3$)C)f}HP;|&Ub9-3auk8i zHMjc@TGIaE#j)8SM}6sa`)?V^Q6l4E>B>>g#lKD9n+umLOX&yDbxX|;8MQz9bsvN5 zzJ*-N0a{iI9zg)LSwJg>UW7s?T43%K0j){sF6FR{6)6QxX9|F>;}9@D@bWn$1A{g6 zd<MA}OE;s;Ug|;I*?sKg0Y=chD<Y*V9dfTvhJ&U=f0xR2$h{~*)$kWQw<q!vbU7P% zzVpqC&$B=&;e%xaN2%!lQjzfgr95FT7IT5x6ap_n*Jd@>iu?!l!jF~mcky>{IJjG# zE|K>t{rp-A&gJkbVg2tbQu+?$eC7@b2kXoHt)Lw~7V@Ce(M1?bO?xXqM<rVSE0XJV zeG|~_`iFlTL%@p*`#|$App9Dpeg9aN{waP0x&Y_T3P%3c!{9N0k^iMppsS~TFqT>M z*0BBStQE2TSEL9rLj-I_50V)omZc)akGfrXy3cF-ih%a3vvkP6X6cAw`)?8ZqlCTN z^$Tb-KvqBm_|BUSxfj8kP-bNBYy_ulWX0XbUZ-@Q&_37vlc~nHw*u+}s5c-^;KX#o zacx(T6^tb^9r7<eZ2bSf`$U#jL?<K2TyfCqki>$&ulYbcn3KS3VoySnL$@nvv8qt> z3ywyMyLTBFK)WC%w*LQ*xUfY8GT(R<bRv8hXb$|NrEH6)BSWc0a4=|Xen!eG&`>HP zXgWpo12~tJaCF*&l)M&&<hEwe%8=u%AR*AcR?AqCI;C!3k#1K3PYa0>4hQSgrQe!Q z{_l1b(LU&5?J82s=+NmZvJj-c`3Dn!%NkI^Jj~y+1T<9xT2TU;nF3$Sq)^Jy%?7&V z##N!)^bKh7!vV`!70|j65&o$MKskx!C}@pJ!2ePO$nq2ZmVQPChB{}+e8%_YA52B& zy)O0~whSx`4CTTv`ji<Mx{p{NE|EFTaOMmH!)w8S7d%h?|BtjjT*7&r0Tf2f2RJ%i zzr1GdjQwI6`-Q*7juCV#OX-*Y;LD^yw_PZJR-^E@JO+((nS#P3I5_-2NC7BA{=e3J zqSN<>^=Zh~^6#!ZAgfC>En{W)TR?k9t$k(q`<H{(DwN9nFO@*n`EmkiBJFgYE5!L9 zLC&}Ab>W0MU+l$sB?gA>FV>$+vW~NXoZozm<F!=43op<bITRmse|XJg{LT7vi6eMT z3&M4<I8+J_2Hj@G5*+-R?LXKdAceu8fCNwbce?%vdjZ~}{lE0fi}j$H9oHX`FC#%y zEU{lYV?S8NazJ87q|=qdG8QSSK;^Q60(idf4QO98Xho1BD2`nf_*-r>FfarMgH{>* zFBJgA+Y37dPzfQ?>H5X`aLJW!(-+_sLjOxeKzl+!OB5ligG$+rzrEZJIttph`NxBD zi{=CHP}!--z|j52`gh6Q<Luy2ISvjL(2g6_c<ui2n#uUT_3x4`|4V-ahrckG1j?g4 z|4V;_gJbs#WMKkyJyI!)@weBi|4U_hU4Q&9l?Vt21y1Rk7rpYJ`%5}YKQtea_<m3N zn{w%o@E5(H>o;CY!GaR8%Hh8#$V1&9EMvcvaDu{e#zxSdGS?5*hf8=YT_r$^U|YdL z$9hvAfQ}mkwIE(hp9*R~fQx$Y!U*u8G83o%|Np;Kqu2Mt|56pOYd|Ro>~zopcrP^m zfc&F?ZIwh|AR?nL?9g;%2nOf&pVo&<tw0NpjK8^sf%AIUf6*VXY;Fot_}T<1n}ZgB zfdyH?hJf=g=r{%I!~8ABLFFtc|AMY@2j^djQjTtRaQ>A*<X;6){uKb{U!Gog{*{2` zU(o$xbvBLvKm7k+Uv7e&cQ1j$9WCz$fEMwgru-YNw@Wg6S?mL{7=mB;O#p=mPk1n- z<pavS5}@1*I@d}BH2us0@ouN<kKh+4LBoEoKO$e38h-<24zS}zI$dQfW08FFzf|Uh zBj`pXP}&An>F(C95+!n=L@f~bzmzB7f2qWaOj%GGX+9!h{kh~$CurpwQi>>*`7inf zGzjp+`ZMSNkhb-p6mh&a^$k4wXH3Qt{gWnxqF)6Z{R(I)?S<GskWXc>#XV>(L+dyG zmPSSfhW}+OFT~b^4tn8u!3U;!Ua)~_ffxVQfy6~#d;`-GFW!M@vlq`nRGGqy`(Rq- z#dR>P@!~v~)_HLpOdGt|52j6CYzNaaFV=%;ix<nmw9Sk8>p(7a_+RGmVhUKu<wXye z_IS|(rhQ)2fa!o2C15(_MGlybc##68V_w97>4X;{U^?Z6517t);R2>}Uf6)?f)^%W zy5xlpn67xC0;X$T$UvR24K!f?f)6CR4Kx7zf*H&Nol^1Q$6C-42%vT5FW!QgphEe@ zBQSFc0|Ud0>tH76rh^w}z)aBMt``TvOwfYk7u�(EZ;pR)d)<K-w0p1$kd5E*4TX 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/gui-64.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~P<Y833=9l>^1JvLws4+R+`;H`Rxu<avsj^^ zC_lX@F;^iuF)uH_L?J0vp{O)ZAu~_G#XndfH$Np+kC&HA1!}T#+>+Vp_NPw3u*1)d zCsM%t(<iL#Po20`5OX5g{?v)eT)z{}U^@OpE|~T_!3n0LPo&wOIuVqaoB=WeYAi#5 zD+5DH8w-Qv#_m9v*arq>25u%!28L@43=BCC(KFf%3=9HbwgV%G0<oDG7+4vYKs-3j zP{0TYBnAeMOan|4R4?2R1Rt&fYz~VcBZCH*1tk&~892D0Y)YsP3=9(>PQ_}9UP)?2 z2?GPepDR!&g8UAOY$VkR3=9c+MJb6Ti3|)oG#MBeJ}@vaXfZG_+(J^sz`)?Zz~G<< zQO5AZl!1Xkfsuhh43v1lAqQ9Nz`$@ouK=PD?8gK~1_mAm1_mh%b;KkyxVfVY>W6?w zXN(GmM`w<TfJbMEiiAgJjf#R}h-0W@m`C#)1)uJR9?d8J8z1oO{<8}dd7svKe81T1 z!pZ2-TlwE3`NWF=9tH;EZ^mzZlHVU=Q1a-FVD#z!(E7hFm0!LA<XT7mZ9F;+KVwQ+ z{vUg--tbeYRH5}-orp{Ku}v`^-KV?%y~yHWVDMnRul?;9bBxFT!>^f)zd7=6W6|;W zf7IjuVNdI~9nSx2cC>!06GGBt3en`zoulI6(Osev;L%;95^;=K>6kMkgGYCaii2nO zF^}dW3XXA(v5ql^&%gl4zY^gdjc*cI7#KXdS@#GrGI$st@#t((2>^@S^yogwzm3zQ z`&Y}!65$CR{|_|$)GuW@=I}qJi=*Xa={t|!78OuY;nUlr;=shf;M41(;^5I6qGI6D zecGebMMdF-zaRrcLyd|71Apr}1~AhhhQDPo0|Ns-&F3MSg#;NGAc5}DTchIeX`Khy zg6|hS{-5ypf6{~bM1y5aDTl}ZlMR+JC87{n>k~!X#~2wPf~BvK+yrtZGXsN9_i2yg zE-DJ3IC*iOmw^EsojX|=85mylaDf~)Ma6-cf#J0fl0-2`qWiMr4v;dB?h_u}KVIzS z28G*kkM15wfEk~8!2xn{_Z*c5PyjX_0flTlEW|<KjXQmLbl-${)u;QFNB8gE01j{h z^Z0-A#dl5y2IK!8-JcyhYZ>_War<<Ca5aA7(JApFRgi(9^+1Uzzq|_r1OGm6Mvwo8 zUj%>!OF!^$)Asm(*rDZZNwfq1zOyeZz~UvWuB}f>JRKVTf)e8K*Eby+{wkG<Iea_L zSjuO7z_s-W|C9p`MsHoZA6)$3`oBcTr~5c4eV%)9h7*)JzZ?Gt8M(-zL(k*?vDdRu zl&pj)ImX7|_}`VmGuf5F<Nq<wPLpFGO=|r6xL<4(0J~Xm0?fS&zyhTo8mt-kTiyTv z{|`>IXz3YC8un;@qtSY@RH&P`Ns*DE^<)W$@umNwW_K7Ec7XDyNAnR4SkQx$JShAH zK<WJf0|SHc0Z@qE^yu|bDRAj^&oI8!xkm+5*n?7D0EmbH5eYA@aWF9ShBJEf^7j1y z|Npp)N<jvweIWYoHYmNvs04sgU4c($jEV<Hg9E78umBMTuEr-_jSqNqUp7A3S)-x> zN^&4~{TE$*8x#Vi8ZUmaf>N94>U$u{BjH663&>#}-E&lafHFwq5s*vc4|lt$BzScD zs01{h`rpYqRe_P=zi9kzP}=hWSw98r?*F1LFk=@(jMae|D~-e07O+MP>%f6^=FAyT zcp;_Na8OwYDG6UfQtEDycRaiQdM3a4w9do&u1EJLkM9?Kx=;J`1~S%4d3D>If++m7 z&h!64kM9><m@oQRpRIZ3nS9El`|=BUc96eC&)j8T@a;b8(S5?F`@st#epsIO?EVWe z_WMPj-pv2C20q;^_dJu&di07;z01Jh$$aL;Q$A2A*xZ9y<MID6IM28+zx1%aTXO*| z9eH*i0T+X@jxpdo=@1<580H8{5D`ouV_0|d!V5qHP-)iv$put~`6T}YmuZeW7#JBC zj8Fa-{dE)OMo_tA0JhYl*M&zPl$;DatPhq+@XIqaSm>1qfOQ^YU;vd^)`!Yp9|Om5 z^U42UoyM0wt@G$+wYm!m2p<&#k52dh-K@rU85la<*<W1W!NAacqxr}GQl%H?K?PT@ zi;96qujubPAmttjFPxYd7<!$VU;bnS2~1HjU}Ru`xU&0%N9P(9P;2Og?0N<UkK_{` zy?b~-^4+Ijcy}O_d;CA;@&AyA_4Q(Y{%uSx2TC|>xJp=TcuQX%V`A{=?E#zV(JNYi z2V^v;b@f7p50rdMR6V*`Bf&0#D(YnHW(~N*z|iT)!M}~w>kb1$ha(Tj|0*DJj6lWf z&tL!lgG3BGx-C4qZ+LW{e^K@ml;K}^v>qr`c<~Yx5xt_fKzXbCxJR!?!izXY28Lc& zrkA`RKXz_W31DJi=q^!F@#$Qm;sJ`K&Nbk=$F*0-d>01;1A}9)D<h~nJ_ss;yU&8s zl+us?|C|3YdUmp?c=pz)aMUSyG#}>pf6k+u`vu#N|NlLjk8^-TJeuDzdUU$~D18Qw z$QQ4^|Njq8<RAr}*7rejwTk@mEugA{!Lys^-izbk|Nr;+e;7$Y&GY6O6$J*5Zirhw zj<bVQmuPu*U-9TZ`(oEp28I`mP=DS6MTAF!PxsLmWef}qJ3!(4TFkZkC{%IfA5h?& zc;Wc_|9_uusE4~D9`@*lL@=oO0VP)t<1;ThLA6xl5m0(|jCYKSk47#4J-S6RWf&Q{ zdE;dm863f7<jWsm3yyen1_*d`dT{u3I!O3*dME^kg*%3LG{3R%=>BPZyZdwZVGrxm z{8JBDA1+mYF+q)i;W)Ul3o0QLAjO>VCF7GXmZ>r@G@tnYQk0Q_0i@+JOiL_IEyYkR zj~GD3X^Kk03s7R7@XcMqfxmSss1)oz|Kgc414HwV|0P<@KmL`ddL&=)=sx9f@F%NJ zFY9qlMuz4`@*dfjB0QNzPI&b4s&X+hycYE6<(1(AwSO-9^s+9}WMuf}WKmzL3Nl3s zWQr&#OLQOfIQWCL`Juc=_Q?oOW}XAz94#73lwPb;#pS~zDhv$G=l)xNF4Y1hUSDBQ z4)yIm11{)8R5Cz<38D-P-5)%<uXmq*!63rGFaadE85AU-W|)OzOne+TUOakPJ6RbS z4m$*cO4V-G7;8p`-69O2%vH+11Jt#8&1!v^-{-JL@(FOt?qs#JW@LE5qQ=1B(aFlI z&By@CH7dOU93I`LJ7r}+lFwDak{`4nlI%OA7#J8{R~Vo4=oOV_Wn}Q^6k+seK4jq0 ze2~MV`88t+r$;yIAuUFR*H1xy=oJ-WWn^&e^<ehwKH<|VnxVnS;Msiu8cd$uEQdfr z<<l*~=-K@1e+jo|^RIs;tiG+6O4*Jx{rms_zvur0AmcroUow{NF+Kn)a6z60)zvTB zH5nKhY*j#ApAyy=g6g0`m)8yC(&i%?FAu6QFr0ye1*k35%bUZ($lzgpv&hP$m-PcX zh<&46&!hXY$Bxyjz(C7G`=ZD9R~`p{F@qDtOZ#3QL4g-G+6)Z*yRs$tUvqi%dK>%~ z4ZZ>@u8$~0ABLLW{8PlE`&KP~^Fe_Ze8{T34E~F%B2=F_19G=VujoT&koBjE%sqNp zQ^8I-QLfFut5Aa9L;Dnxd%nL!cg%WC28P#M9?b_0{)=9|40Z>oRRS`%`KL%NKmV>G z39vibAPRdyPFMw32nmno6cq<Z<NC#7El{Z407bmCrHhI~iRcRkWd=|}DB*tbO^Jb_ z+egKrlf$F?Ff8a{)j5<-OM{hP9^D5$n}2W=1@mva<hhd(3OxDOU-WGL;ZP*!@%?7= zL-rCjAMJx4odO=rCw#k4cs4(<_dNKLt<)02VfQ@vlDR}MEiG-r1dmQZP^$9$f3oz8 zZ|i{)t`0$u{|7z)pD6uym|xz30i-A`ZGvaxPX-wVhGGMd`p!TOkIp~=kLH689-V<V zJURm(c>X`>(HZ!{qciY>M`z%V(i^X*q=DPF9{h&|J@^j?a)1bk7XHJ5H$XhFCjP^L zFF>3RAmT^qg%1rpDhw|}{{R0E^*WeB_}{1drZ4w_5)}{aQ{N7;muPe`wH)YR5#(=q z3@Ud1AM*TvqJ;h1A@<T|uX#MX4<GjEWD)deKE&bC&E(nqf}=>ybLanmU{L47e8Q*u zf@kxm|Gvf-J$Eud!m`n~^<v3M&*lRh{4L!K3=B}?LA8em#Q2JqCmkw+C8bbqrpLh- z0$^1oNl>9Mh>Bn+*Bzn40V-qyQDF$>s=|$shl&V86bL}L{H->iYzp!Z^C=JGOP<X? z1d3e09b_-z^7wzSL(ud8iPs-Jn_nmtNg_v3XP|^f^FalWMDcUa<^v!WM-eATN%KJt zkd6Z!p3N^9i`c=j{`xa0#LhtTn`^g(NB1qC?vswqkAFCRV_@;=zE~pc*zLgKn;gLM z{e}<oMUUhYKFSw8lMj1!iwJmhI}3DsaCk6#b9{4T<}cyl-{#2N{NRJf3{XHDpYrTJ z2~OQFXEHM|fb*ztx1)te_bJcri!VC=|NjrJ++ZC5NIeE>LwCBUX!vycs3`b?+M0(v znos?I!K4Aslop4<?Og$%P8Su4P*C*;>i9c`do;f>0M)!JK=o7i8kHHKw9)<3r~8xf zCExC!-KRQ3R0=$-f0c0gSbr+z_pv@y!oL&LE`GU(k%0lk{pe$Ts+7mWa*E0X1_p-G zN3XeH?2>Cf)~_H^3qVrGAyOcA$!;I(M-ZtEAgMJFDG<A40mOIR_br4=xIyj8|A#%S z50!sxu(m4I@v;6?qUhQDgPFg{8q^xx32IXKbRP%#)wBED3t>$L2IET}z157bIY4Te z9XrH4Kt0Y+9^LmX#7j~^U9?*oAVt=PN?1Xo5aM0THu@#JHZdifHhQI;9^Ic`vv~Ao zgZi2l!lmautY4Mr`&j=fQT6FQ>!W?%$Fc|PQ~tJ9;4p()eg4G^u&Ey1e?d0?Dq(i) z5cjbDR1)Z6{k_P?$NE)?qEGiZr~#lbC@X}!`|OKoux20YM<oFs+V?yx=cs_fqRbD} z+W-x3ocizCeddL!1_Q%ueXv;`+V?@Kzy@i6RY4tc_60xOEEdNO5f$SDFDEiEFm#`K z&C>0oQsC3wq5>MP0fi2SkM*H4P!NIq#|w)$kcc?Q5<ZX!*ajBIj!*`W>%c-_r-9A( zu>Mu5`XWvil*Uq26c~1c#t0EDrcQ|$MKYka(rY2>Q>E8mn94FR>{Mc4VCdxNJ_zc* zRCqKWF#t8?Ktnh2aj~HG9H`aB0UDwb0Hw|VPf$Dh7o^$m(ftwB90WPvqx+!8_Zyzw z2Ysb)`zqh?_<qBq`>?O{B~VY*!K2eh#llzl0$B982S_wT#Q>BwG(5qgKHaB%r4M*? zhNvibbYFLDe!%R}eeT6AaBDFJ)Eg~P$?#}C5&-T<fy-4Gfhb=+ta&pT7#T_hJq{ie zNc(>9|Nl~^&xbt@o)mbw5T&j^<|x77(Rzu$wTXd&;f1Lws0HIJ;L$zd04TF{3VU>S zfX3oII=wkOx_Mc-L3Q!P60z=v6QITtYYitOLn+4#PGgWhW{+;xWDZ6K4@+l`5@~Qj z(g9Y+8wyg!`Qnu(NSQMSNa`Ed1g28aX0RHjW6lzcuQ@*R=QDlguV+NAL&5d1L$htU zB&Zvbe6v)*qnkCFi;;nUJ4;0K1CG~WpdN#Q@ue4P-~kL56@}&<Jd6wsjCEq55hw+4 z1Frk@3v)9D2AA#|uLV518$d&6F8teNA{?6^b2QYbSTL0Ecyzm{7&I>cIr*<6xDs~& zx1TygR3K#&D3TOFEye_o)=Q<TFPNlZX$z68Ag%Kk;!@z|`0G%Q){`aIKyeO^cmvRI z9XN^f`luMV8Xq|BqGIv?|Nr{qE-D^QpeUHf#lX;<qhi6>eWQX4H1c3@jFI6rxG!g5 zeDX!T87RqmG#^O-ISm%^P#O{cpf*6MhxSFE?o*z-VO1iiqLJ@nbm|h}^!R_!>QHGo zsG9X_IZ)!|@%<pEt5o{Xt5<|Gt?|)+{<OwlKlsZpdUP{-b&GI%SRX1q3T|OEzu@rP z1*?0@1U;HR{P$tL<Y|1!v-NPv!Ph(<#s?02NFVTMzVZKX%cT<amTx7>9tU3uv|K8Y zZuwRs4rTMVd@JFG2(z?&EA0SjI|Hk;x^KSlw`5@GKK(+$9Mt6EUHg}T;e~-A1H;b$ zpkL?PPa{{tlT9=*I1&oVIl7yWz^(jb%c=oQUB3(|bzzvw%tAWQe@{};fu7bq`- z)0IN^%@^DM|Nq~8`oHM;lMD=J&Yal^>dC$=QUGxv>@;~0+r#=)u`aj(0OfrJkM3Wf zwsJSKN9%zSCXl&@IXtZI7rh0Q9R?s<;vw}K2Ut01GzzT2`c$!a>w!{Xk8W;I+F<&B z5#0T?zF+hbS?3vWoe0tE(QMl#2kOM!ERpc&<*k=vWO%`44eG3vaDW`12NE!~0(EFb zt4@O`UhmTk3@_^b|Nq~5pft*(m-oIU1H+3hOOTwbJXndX!f6JE*L)sWJkV^b46?37 z-lLaS3S{<NE3jq!uEqz9PdfGnF#Q*0l4E25`6)&P#joJ95j1oo0Uomg5Arm>ad7Q^ z(0$9L`zJU&Ux>*wFidE+oyW__z{ub7hk=3NIBOS(!@$7c(xF<<%gE4ro4@ruD6YGC z8)O+7UKs0x;_?G%n9snY^#Fg%e28Q;NKy<e`2!@W;M4sL<OU6&?iV1wg-7#y4$zRG zf`|3LBAyrb^%xjDEZIw$UOxi~#CUY`zqk$(>%Q^gFo^DC|9{z|o0l78?mmzJsEFtN zBE!h=V!a-yRq?r$)yMipiGok}XHa6$@PN<;a0|O34td?`(JRVx3KZhJZ%;BXyx8*> zGyo&Y2@(1Q5?cB9|NjY~F<~x9!2FeAU~p}HQmS^GwT_1oG~~tL*z2Rh@#2XL1A}At z`4>EY|NnRFKL1}-`8cTc)g7Z!0Gf9IRaFk~s_O6=P@mZN(#x!Wp!T<`@d3x)0LGUw z|Nj364HdZbIx)WV2TPp+kFpz|bm>0y(iS8F$rCSj>ViW1gh%&{7q4tV%+oIxL1{h_ z2)_%;uY%H-K*_KB^ows65cx|Wx|g^9|Ns9ll0e3FvOfO_DlWl&K~Ts+rg}hQfS_s| zRE8V;7mYr~z%XHlZxjPVnkDPAtN;I(CV3>YN?rp6o$0l!|Nnb1A8WJ#O{<o08{h7P zG(}$f?c`<x>F|(17PV;J0c!8_l_RNCF}`g%12n?RKlLz7w*cHAk6zQFtN;J+2Q?zQ z&%apb3`+K;ik7xK+>8vRtS@$&Ffi<t0Tt8jM$p3O#n#{d|G$XPhpBwT1y<P)QVE*G zeGv;+*$q-DXU4!V;l%=ekorolozft~*na>2|6erXD5!R1t(0P9c+ubpX18)NGQ6m9 zfT{(ROD}Hy`v3n$rY%&66Quq4umAtM&%ZeH8<g8i*t<`>*a}i~!iIstp`}J8hktvB zN`d1}&@`_Lzw0TV?gPe`KuwDDxBvfl{{RiMw%#rUX*>4!|Nj>^|Nj5~TB`d;^B!<B zkD-*K`^1YKfB*kK^Wq#Rxpp6a&AJ0r4EyxXQ31uAXLq!OXLqrJXZK@plLXYiezD&P z9M>8zg+R&bj7RqokIo1VkIoDUkIn)G(3lrW`QY1K$>H0r=-FLp;j8`pn<Gn_FQ_^7 z%BTA!f9oC4oWXyOPLC5loemc)?fBcYK`nvaIG%3jA3oL(_?wo4+K|qFK<wt(3=9m- z)hrDBEufZVvo&LhWH&Q7b$N7O^<+N&|3d2l{ti&Ws4I4CtYt_p&V5j-;n8gSU4oH; zp+wH3m-n3nBg2c8rl2q`;R9z8&+fDTMXyURGIV>hK!)$YhMj+L*@=O{v)j#~JD9~c z*_Q!S<Y;(yyJ>hbUk8t?p9P61{1@#$%)s#CniB)V|KlFbhXt(dinCtY{r~^p_`vHl z&+bYE<F}sL|1I^(LOgoo1iHPy_*g$IvV(Z9*v!NFXAzHw^^an9$8WAI3Z?qZ)(j<_ z-OL`=KT4Eei+gm3s8o0|AK%F6*~#Y8?fl1=`MBf%3;&OTZPF{+0PeK-^n#}&qYXT} zvmHFUi#<HMA0rnTkopExR0@E{9~C^hZ@zfJ&%n@q;)S9UC@lC}rh}5(fj6L0+XDt3 z);CI7j1RmPez6WBk^mAZ2V3@^HIJQ<;k&a0s2x_C?9;1y2{d$*{KK=^<_|-u_D;|O zg%@5z3=E!~EPp^FDiR*O&I%r#&H^5t%;2%uPG^-)XO7pBp4~iujytP>G#q#408t*D z-U1$-+>PE6OoGq}r`Jrdx~RKG#R63MLS|cAPnH;f8f*&uyOJb$Ji2cc%XoC3dT~&M zfuS*3;{Ut<|C^Il7(AMl89bVk1sFgY!R;ysu%>TL5)Pi-H%fRsnyUmDN?9HMGrU%7 zcH;P7!Ryh@)WPBLpNW6l!Pgx8`%b=irUM=)EoI?ke$Dis8ER7Nr8*x_S%*BA0~&Gk z?EdN5{h|AoL)S}CN2~jqL)Y2=r(d-G|Np<){(lKe>+SmIkk&wVj*11Sh<5;)2+3cl zbLHUHh2u8|kW(RsdUU@m;qh#)06Upc@U?mCr8?s-Uj~Rx|4+Y=1GSU?A8oe(Un>5> zR)B$_*+Q#S5F)+N{>A@)|Npn%u0M;z0U-aNbkiH(TmX%!ce8%`%)kJh#Xi9Vo^0v9 z32ORgfZ9sEJ}MQS-4}ejUv|2vB)D`x=yXvDaq0fh>7oM4BN3f0DgiH2KL7vkYJADl z`c|pqi^cp5492(7o7N!f6<%!TV_>kD1McjW@OyN(sC0m`J*4dp8V3K%&cNW<eE$D8 zX9)+NUfwz9|NrN2-34wloPHt13#yex%Re(PI9eYs(EtrfEBhoL@ag3(KL7u}XZH!m z<_GeiQEuPt0};N=EhihC85v%4`E(!h>E#VL|Np<^HwTOQQcaL<IgoBi@WA+?=120N z;abRu_>_YnUEiE68cG~rT<62>m)E?w{o>et{G}l~0|PivewA!@=+but&5ebqIJk6% zsJJ+GU-Idk0v;N1w0gzg@`?>q{mxMVjhQ&^1`T9;{6Fq!{mG*fQk?VmoL~b@>O8QC zC>QeJ-*?oBe_s#BhtCWQ%@6rsGdp&l@<=}9k$lplSLB2f|Gp_)0$&&y4*p{43{i>c zKILeAiNB?ioq?hGB_n@J2M3g)4`aNBN!@}m7Qh(O*%%m_e=_p7+ORP&IPmW~+WaGh zzrT)=fq}oJfeDm%9Qj*7y|U&X&ipMGK(YD5mA^%g5hUf#-=Yd;1efGC|A^pkc>?A| zm54Y0NaSw;&3QEcNak+=)dMd*SU^RxD}!hAQ4UY*LnZni-4Ps~*0)O39Qk)W;pX4Z zP%Jd_xQj{vsFv40bn(YaAr=M(P-q6c<N!}x$@+d|V0ihFnSsIa`w;^U22j@L-}Q#u zvpbf-)%v?*_pzOzJ{!NwL69Ae-;W4zfV=@3T=%rT1vA=%-$j<^BPcpfzx)K6978p$ z`6vfeXNit0|90OW9=%gkz`gEX9~Bqh?!zypJAmWe(fUw{>~R;B2#|YU3p;kX{y6TU z;sWAzv_N&t0n;yinHd;B)8rsIhlZmHj?HHrT&+KO^g`qvyFc^y>M}7fIPPO(U|@Ke z4G#BI{vJ_gP$;L@op1h;$=~u39Qb+sEnC5ieEybMU`9bnYV(g`{+6%*{{L_OQOe(P z1}t2`-+GmafnkR_XtpEx|A{mgOTiLOkLH6+j@E}t-+O4E_PF@-wW6o>El`MjdJhhf z*IfTkxL635aCrPb2vYV@`*f#|ip$Gxu<Jk#CrAEWZ}@kBdZnQ9!f_`^%(dl7Wdcj! zF&7md1IOOLPaQ5QzOREF!Hs8-oC`=3=WAQf?pkp4ztFLT1tEV+#UD_<J)%&;n$~Il znyJ$q7N#$AKr!8X#sShs>JCxy0HqZEB6bkPQ_SVt4M|O}^}zA{?TA8&h~u{-4khfq z{QF&hycT!m-|qV3wE$R*%{STg$7>eXZr2}RKCiF!p;`{l?>9hh;{ch+U&IBXc#4=^ zyAQZpf2!qh+y{!W*W8ZHPrkcae|F{f|LoFTqmlrc{^^~gvL95ue!n4oQu$P;kBWz5 z_c_P^=Nzq1)wB9qA1YBWzU0|`z%%)z$M=su-3NM|44Qvf)-gLWAMarH_<#EK1<-0A zkP(ji|NsC0U;D7f|HB~rIXhicT=<(oqbi^z#@S$Pz~90RYFYh1{oh5!<ruTUOHkje zl+U5zZ+fXC)RC4@2Rb(X11%-0({$|J7YovreEvlxXb!Zq1za3~y2b1s-8Z_wzh-mX z2U6<U?aJWM%{$>212}RV`1k$wNd5*|^8_lbUIZwDN@X9F3YYHlpjyKKG9q}a(?>-E zG>Z*V<k5ZErL#mu;r|84?mxx{8lQv4Qc7f9tUr`Wcy#mn{$gNw!2vcWM5V$5)ZI5e z0Cv5U^^a09k8WONkcwvtAe&$+8mx6oLGkj212mc3efovJ6*$p=g2%-&L?wd1)f+UN z3yN?<P{45%vx8Eg?rUzxZ$}tQ1V9{ZaG#;GM#bZ`pyRhAOeJ6?3a?*u*QkK1?-0<M znhfm{6&LOAj^B>(lnVOv`lvYgbRX@$wo&25mGA%mg9ShhRUeS(^%o*P!0DBvMBMS) z5f&5;1}_$W|Np<cM#aVWfTfE{KuM|fkGevS?$<8-+kF|p1qmq0^!9)o=#D!;x&8ln zkLIIHFPv<^o&)7MqwXmXdFx9hYChdADj85G^r#$QVqkbN`8&8WcC`Lgx*Y8M*UDhZ zvHN(Zi;BZ*Nw9LTV?DZ0zes^7?{-mfaI`*DBL#AGi3nT`$eVA!flUO}*Py|CQ0Xk} z(S72DBNy0Fu$s)H8&X+ym#8>&hp5E(^zz<5{{KIuJ_FT&R<HP5Ret{e?_vQN*#|WN zdLT`Jh2Y`4?qi^_SWqJbG&TS36=*7dj*0>^1A|B75m0Ld-tvu$J?zl%*R#aRq2X^v ziMB(--<%R&hlao9rPDwemiu*ogMCgZ7pNBH-}Q#)b%SH`8G)DO|NsAYY(As#GVlNY z|6QPR;tjuzS*b`vJ)=n}pGWg?CXi<Sm;V3%|F<y)iyOhkzwo~_2Z^Wfx9EfDO#T*i z5S`E8A`hZV`CG(6bOnD4KZuUtZ(;xc|39dPiUF<QsBqxlb{517c=5vwwC>URScxL2 z6OaKK?sRbII{U)r>;L}_UHTsXk2_es<8NUC<<IUAPz1ZEfE7r81;@n8ng9O(cWC&l zRVwM)T?)>YuGXLUd#C^V|KGLy`^)}+|NlGp@@xZD*e<;#9v5ELf@MCvEQM*5b%d6V zj@E}jO*;PGsDI$VVflXJHGj8@N=PqH14w_bi^m0!f|phhtqLWM4h?^mOAH+v{%V&f zIW+v$EfIET_-nx5DgiNp<0U_Y!Sa#~!eD&)7c>IGzv~VA%g-QI^BJa>ul_;;rvMZt z5g;N2M0mJ%KXUE<4q^tp1b1zNSV74Qv@#4d4gwk`Qh*NEX0R|YI9O~^0ZkLVEdK@? zHbL}R3j{nmD<ph66BMBHQjKpw>Ofgl;lJq0tqcqkc13`Ou6mPBfM!DOvw{{n-f%Vk z?`eI!lmpZptp;VsPS&X$j0}$5XF7RHK*Qv$4BVgrr5nZ0t{v4Jp3U6<9gjJ4a=CU^ z^SE|YTR0wbw&Zd==4=HL32^PG_VH{!9O2Q;>W{3s=x{f$8V4gonu}$PN)msICpfBI zR5CoRkMp;H=AnFgGgv&54Lq5@?q=X%V6c?n_mKdXR@SHadwW6iM7^ee*clnXegL^& z9^!sa>*FPvo}DcJx>=91Gcq_bAL(S>!_LUy+1m|q_|0NR42L^5BwI9Kce!Ub%Rdj8 zpNo!mv*v@kg#V9QAFgS6&EGAXz|P3<n%$?@6eRB0{om30eqEhMv)%uaY>#HUe<i7o z-&`3OOX5HjM=762H{X9zpDmCkyr)m{bI=;IgFjduo1e)0W<QDWWmY-n(aq-B$)e)e z<;vjL;iAIf+3TYsuxkN71H+43S`eM=j{jX$cwU2J=_+V-;c-t;$N3nC_3xS{*Y4+@ z-Tyth?|Wq5j__cXy~@VO;L&XTAJikX{#U}*;LXwSy8f6mN26n}i^_jc72SOB>yB^# z|NnQje$MZ5;=kyk&7k(q2M^Hd7cWqdx_We<_%AwnGsJpxk4|I$Z3mivFqMK#b9l|! z{DZlarNNtn!=u+5>Q+6dTUq}*^Sl;lKJovxUV}G>gU4}Z(6SH5|3^GPqYD3-`FjFE zL)pAyY@lU|3Y$S)u-DAZC;o$mYCuWWvpZVBv%6Tsv%A{Bw>#MaJ_G<75BC7AIchyw zs`^3;lv<lXb7ttBuNU^9hWCm8ubI0YWjvaXSR4k8Q}eR^U;wYBX?*j5m4Tr-MWuiN zlsig{FFEd*!oa}rg6BS{eglnG_O_@9fRbo$510l`iGdey2K*O2z6lgmb5uA$*7t^} zICylQb~Qfm;%_}<OyAn0IYq^S0aVgCfQ(N7w-P|C2p`a*J7_xrWV}!JVUVPP@yQoE z>lqkcD}bt;7ofG7oh?xFTU22D6(IL?L-?T9vp5R_XkMlS)FuP9PC#vp|DuAMKnoDN zZ~PbizY)}Y@KN#jFZyO9Xket2r}cIzN3RFdiytPSNr-bB85nkfOaVvr4v_N3BcPB0 zk1c>YupEfB?x6m=fk*dCk8a+5-xwGiyKj1S|M2Mk^uj>`;%zCP?hsIi`81@1?$LeL z2Q)YM|H5lk@C@^dW)o0(6N9cMMn&O8#y?Qa7Xu2)9M}@|<|78+aRi@U-m6bQNyM}J zqD!v>hc#D;_WuK(%omz}=oWqIb$r|WL$I7}2QLEy!{Nq*E}*G>&<twxPd-O}w*!Yg zW;k}c9Ar5RUIXx=9OBqgPLE#J=T8|JUbA>K9}oa90|1W)h9k+JhRKV7<soA&-8Wwt zBdJ*qSJNr+LP`R(Kuxs&DI`Exe0l=}x=+8b235kHOrU`gP{3jdR|Vt$9^D_C&;ADu zccy?QDZ9bTcQh<nqrNgQlqrCQ(od{sU~uW3|ALu;!NpqE=_@D>e)GHkwf<Xr0@U7t z4!?9ChKz?aA5n-uj2O=p@aQa%@aU{ifDD>}Ed1or{nD}d%zx0LuI_7~g@>8oUOCum zElbw>Ul<t5lt5PdqF8<W3)pH$e)m6))_+P5AX{Doiamr2K%-l@-S7=G-U4xhNB4D* z0~8Q`*Y{}sU!rBn8VPa5x&NZa*MS0H9y9<P!LIo1$nXBe(fUj2J_4=)<$sjD8{lzW z&={BTH*i9J<=A}ozfbo=aO%AZs$bGE9dqV0I7rU@7qvoh%oflPO*hCfUmdN#mhJ{Q z2DZ}z92($ZG4KTaVbE-vIe6U82Q-1t`{O@oCB=WyhIQaPD*hrEGywz3z-jBiqnf|} z{Qutx8>xf)qeKNV{%K(Rt=Et7MHUMK!-U>A=FS)u1#4LoVMd19OrPY(9^I@Q%!~|P z%{C7hN&>vPc^-UolxQvyc(KVC)Rq2U!uJ1IXNihR^KX$FLyvCO+f0lMAXOgV)o63q zf=W8xV-UfIFC71a)|kp}V`60RZdQ5B@c%H#y4U^S)hsWbgO=SM1EoF(P*=hOye=W; zFf_fFsDRfZD0DkY7=QEVzNx}&!&GYj-BE%AG@NbLZK+);(E7hl_k|2-0dRM)fJ^uB z?h`K_SurqJA1~$ac9v*4P|4r?;BTk1#B26uZwZCwbN@ZMy#<<+IT%3g=n@qRk4|oo z^{|;f*gP$0{<HODDf<i1F09u&FS5Y%jU}w08cL3TSF!|Ou_&l#u;}Oi|J^5EEVgD~ z_<lqB0C=z#G=~eCA1wjx`>6p<u&1a<K-*W%Zwy?zKe`$}fkXkw{}YV=gZBhApZ{-d zyH1difxov6)O1OH@6pX##|Vyz7Yrp?Ufm)uzBx%Wmn3wbf6;aQ|NjXd-K=pS`EH&U z;3zV6Z2resD)Pb-RC-t+FHv>;f5fFTMMdScv}^0PQn7E25=<omFQg#Sj{Gj)J4;kF zJi0|Cz@~`2>OTKs=XKD21dxNk9RNr)fd;QYW;^n`e1U`;WIK>gcZx~^IL_ih+kg&( zRlj5cuZ=^*A!y)T0#b(f^s26T0BYA8|M%>^(_GELSgPugd<@)f`G3r#m#4v_mvz+# zP$k53!lRS>1)mZqg_r1h^s;V#1e$j_Eb#xhhxLt`!{EVqNYr(M;<39%1(IW84tpdY z_h3HY*{pJe!T7-I+wk-c+k*wFmlQmDWfdQQEYghv8QlHbqubo0^;?N_b3F%RiKs{S zx&NXUR)G@pxfeB{6)Mf@3?9wL1w5?()?9(kaPxqD!1iBsIY?piVFAzvfyYosp^a{X zM;=+%-3RS<IqA{ObHd}lssu<IWX!t+v_Gr{lukeej7RcK@VJRbvn@AxphEnGgd_t) zub=FT7h<sKIk5+z8t}IV^M9XS-O&4>p@*8k3=AbK-N#;6?*#3Id~q1O3?5uM^S{vh z`TzfM@HRo?1FxfYf+o#gq%klsOz><5=_}O-M*}ET&rkq`dZ{>w-2j@}`}_m0_1kL! z&(4^?46ivsvPr+e>5#YVKB#rzv62CtuRt^BsF4y2$<vUKPrm8VYr6!rkA(TQN3+d+ zhEl;7ppm!M1E8jc;ERj*Kpx|{4+%(6t>p1v^~nm*ykU$Ac-?>jWO)*(Tr>i$J9B#A z@%^KR_3>hr7ari1_vkG=(B{Y&vERY7Qn4QV>wiL$PwRgVewQDh1;zg#l!Jy@=KW$| z=ndfT=|28nRBI);QZChPww?Bifq|h!613!ck32YRPJ6W8F4=UP8D#M5RUi%<gadLk zC?SGcBG5d5obC)j+gZ9_dbFP8Z}|-xv~Rt{-vSy#1y!#%L5o`y9lID>4wOiN#<dtc ztgrL8?E$Iljb!X#JjQJ0@&B-A_eI~<lO>Lh4VDZg)}R)$^*{dRX$%YuT}&ST4}r$U z4mVgals@(BKKbH?1p`Bag?@=}gGEdUA4G9+E@Ug9N4Jkk0w@qAUkgEHg1Z>O`aS+1 zY_Mb~eF;*M0a9Yv#n^J7MB7HML<y=?;~29ZXeA#^s|32%UUx<h>tkgC$6Og0UTpaG z|Nm~#BDB|n$CyF+Qu)PPkPxWh<$=~B@0574@$3Kpkamd!Qq2f$;6cL`T0b~+-}30b z2x=@VIClSZ?EdiL$4yWIa#7K6;oo-Kv89Gtwp70L8z@t|fL5M$fXXu`{_QN0%Ev$@ zcI$x>R&aWNua@#rF=&Piw}7HE08}?ccr+hz0IhrJKGc2DaVKbpuSfR@SK|ZVa`Ma> zm>_r|$;&8683^ikfc^F&613c>`G^I$@y_AV_y#nq<I&68`wo<GmM;Ufb7d>uGcbU< z4H2OBRc{DrMVyaH#Ea|2prr4j65!EXqY}VS;t1MkXaU;)0oo-7?qe8$SPr1sCJm2X zR*QEK4GKP>{av8(uLw}rBEk6Ni`HTWhSy4<J_FbRovbXNQR`mFER#p`0S=E&)`=kP z-K?)bR3~fnTTmg`0v<r{=wyv~2U^o&^p=5v6V#bt)p^SRUd`dr&3f?$#M%sxZq~C< zcENwqO-mUVI$7tuWnci;4=>h%7D}G{FFI){sQBgeUI_|;+NBH(&9-H4LCaFPAnMvQ zKoT)a85nkftOEBq+(3F7kAU0`?w_Hy&%i}zZ={Sz_se~Z;I7YUpYCJEmtLe_1dR#Z z_UNq@aP0MFbL8KC*rhX;#icWr!=*EpC++iUk6zm#(6%G(zg;ZykQ~tbj<NKUM{lnz zBLl-OkRQ8PEISxI{vY&ceg%^01{ZT^#XNYf8L|GO0n{<;X5D_B0XBVD02cY!?a2Zf z@Cx`ZdU^>1!)}oAptV1?puJ!RKr#g#O#csf{6A!Uxaez_i%Qrr7nK49(Dtsd*P8s> z!Wmuow;gb?K2$E|sC~h+`+!%k4@&`P{mUkW7nK)4)7ZzEy4YI|lwR(3;{kUrK_h4d zoh~W{-EJ%{-KRmTmO;bk1<VW#;DrFjCqc<a;l*rwa6i|9q1%n6JB+8(Ma2TFj*)?( z6Xau%M$ph_flK#c<CC4BzF3M4b}dZkS{%U}P@uZ>Y(RaVIVvC*c=Y<o8eek!#>`m4 z)4(av)gl5q4gfUoz|2%4)WE3#5@BLs=x79m)NA%*V449G8UGJ?HXmjJ?K&yl|Joi@ z8~Dk(^g7LV>~&CR{vlb;(ZDIt>!k3S#}UNiYv5Gqb$Wni&i_Lm{|{PUE&}hm1;>!_ znHQ6;f_nCIR6ucvx)KCb{y>_hFYbco1-gH9gO_@?^19t;U?>sxXx;&u?qUFKgP8$Z zWcoU9C#bXe;`<M9bvYj-1~SCJ!&;X69s@&(3#bN>`OwV#zf{blm-RSkD_}Qh>z?(A z64n=gK7-0L)`y@CeVy%K&E2e*!8{iggAdINjG$u50AdGdY}*6eYxh=o(RLlA6WpHw zuN{bo><e<}2JcY?tt>rr<^TU?)vND76JEdnm8u?RJ@yWgqyLLKECTPXwqPg;2Gs+w zGV!%*^Y6c<LdRL>z*X`sVqkcErTO=tQW1}C7Zru$tPN1PZU>gvyWs^ZVi_uI6)Gqg zU~}#s&2Jn$x>-9xdu5D|fRdvHXt=-=w3_60_YdpCrM#f-F6*EF|6fWlfl`m|-8-Pw zlpfu$J-d%O?g5Q!SX%J6sDoxTn9q1Jzwu~3V9@-NwdiHz{}+EjQ<<Qh){XyPg4sV9 z7#R4spZ_l!zmS2!`Y?aXb8t-?q5|$c8$kt+fd&0!Ktn!^p#6rDXaE22tYhhn<8iS} zQBmM;0}VBT3Sc#h7!|b=U5g0D5)J-s7W~^h7_EPni)x?u=nXNKb!0x%z{TRpe8p4y zOzBsT<^xO?5~Y_tdfnu9{sV1d=iu;UJ_45O_G4*$xrCX4p+uwkB}<7+^Gn_m0Y~dI zB`n>CUrX&^VPRl+ExZFXxBHrB2MY%S!)w+Zf-DRSoo+lXooO7enLFb+JbLQ{__rV4 z37Q~D`@H%kXw$Ey?7KG%4E(LzLDQTk{=WnrRpHT#<TLv-pw(zOxePwNvelryz|3zQ zcY&%p-(Huu0-)6c77`_f7Lkl4I{e!N`L{VTT3;v!O_mtRI(9KTGGB4zU<8T!GM}-& zQ1%8iQ)(eudLFb{#h3YxulAMF-JNwTjqgEz1G%(BrTINeiA3{z-Vz?rz<|_lh~IWY z{I(n7x7}dB#qoIbh6#A~*1Tl_dy0QMJ7_i{4Kz%0hzS&KZ$XKp<`<}u2THCMpb3(* z7eN_djtXd`3si%HJJg^R@9;4O<S}rM<~Ii2KOLLT{(r#&+D6>{;e`OG?cY5Ql<B(9 zzu5QZ|9_Y62iDFk{4M>A3=BIJK+{Pv??9H^F#hiW8kw#E*F4ieIy|~hIPL%|d1}SL z&}r?_ec7@5%nJ_CuzvRo>*M^bDqzKZAjKb=8UL3`d31w0KE0}kt}-xqTAwN5d-3P} z|No%zW7YLnK{YJcF&~<l8Naoi0G*b?-^$6z!0?Ur#4QE}M*db%hXGO)bbR^$e?qr2 zOD8MWYX*jHXO2!*RxpF7la&F)xDFa_^XX*`U;F=m^Dov~Nsr`H{M%i;1=1WlTRb{! z85#Z`0x5a@s2i-b@fRoq)QWo~pXzdvlyT~4VN}q9D|!g(Ha7kTmC&_P9?9psS|mYr zCrFinHY3CT;~@Fh_dL2;#cwh&d}wC)Un=O)&C7KY;!oBWBJcnI_vn=Uc>^TN%n0$s z;ZOhnzt#rrS61`sRb6`pr1(w=XmjF=C-46Me-Zu$)HeY&BVV%`|99zr?+DuU4IUUQ z0SztHs04uesi5|ofn)4p(3oAbEib6aT`IEkFK7|x$G`voA7}mk5mM}ddILu^ApI54 zL<*#!_vmia07unL(ClxeM=x(Nr~_ktuq4-`yBRbv3ldLkwqPiY@#yXb9ozzHHH$S{ zf_gXB-~`eQGU0`@9jHCk4O)_iq(Tx&#ZB<S({7NVFBp-;zrF<}vu4nKYmjB`Aj_OQ zy1Okv4r_b~Dnwpf1gq)xU}Rv}4^H#i=U?oFh=Epxcxa!0u@1ro8S`QhgbiAN;nB;g z0BQkQpD2-P-U&KU2ITTYYp`oU3SN|g6!%s~fR|W!^s**`+IW`kA4-Hgy7@tV;R5-V z^@T4;U32{pP)*qF&w(Uk43;^r0NN5=x)*eu2c!{I0$JG>|5E5JXoBiPGb5u%cOxhO zKptg*)NqZEKs`_b<3oZF!3X&Wp}yBK0x~`9(JKmWe^~~60PTbj@MygRGJ=WGqq*V- zLkX`(cK`>H7<dyJW9dnc?naQWKQuRh!h#Vzj{xemfu?sIn@|4#;KIm>;z$=p4v%gm zM?&}rM?&}rM}qjsjuZkl5>XxL!pMc;NU#{XBV8CfK(6%YJ_vFrWZc=K`xeMsj-c?j z@#z-yvA$HI587JSed@)mfB*mcwq7cc_v}9PLKQS1)NBRXQ`5^j=Nf3{?m`Lci(lZ9 z4|HA(Y{M<Y+!rrF>8<+)tj!a2je(&=0^a7~dvOvhKLgYRdab<^)I)yp?>(sD)7uRa z^XL|xew~5gMc98(a=rmka2J%$VXc-6=Rh)uy`~=jRgcbOU^ruZ(&NACZV>Ct8IS*} zJ3%Z^e(vT?yAE1|^}mGozbHt)nK$G*1H*sNApFb!;3NfZmvcbIA0XQsdRYS(gG$pz z&`RIqjxwOO!|_H?feK<BYXnV_I3H{L&d9*v?9t0=asjLuR8T|8C2g>mx|=~FpacpL z6@B;rKg37eVENA7U@y1+2Tkj-&c6mSq!}#K4GxSK0-%-05FIx`xdWUbKw}=T{tej8 z|3!OdFferU)?H&@=>G9v^w<ngwgeCCc=UQO?gFg`c;Wa06l@^D660>(V31wi7ygSb z0;@gUdZ0wi_|l6n|3E9Umx08Zy*d7OGQVbjG3Vv~|HijL!}e_;aY(-#IwT5>^Fl~u zc|gW!1YYQ#1=$6SBJgMic;#|u40OyEG=SReX#q-mtS@X{f)smuKzMo(UIc`v0O5hh z7+7BjL3jlaITi@70>b+S_Fgx*RBJt1!usMVL;w_j9=)v13mF(Zz|G~eFaH0B#76sD zP_pap2E`F**31B8k}SBQ75C_6O*jV%MQAgd?Zwm=|Nl>bX!Lsni$)iS5wK`1(FP3y zeg6IbzlXK$g)0mUB~l)}tm&Yw)z&{s_?qn*KzkX_zu5Z|WEME>GlA9+cb|S?26k=? zw5UVm(-(>7|Nnn+<`sC2dxA$V?^<vaaZd+zn|rT72HictQ4HxAM?M1uCpexByLq!g ztz}R=@0tc0nJSSpz62VX1MR2yFS>6UXwVcK&)^Y`*X%D&{{c6Un!&pjKx3oG!&3<! z$v?YafyPoCJi9NvSbyUGf0y2PM#skApjy3L)C05z#-kfNg2KO@rSc_cvr6}OP>0pw z;6Dxr{%z-8*oi`Wl&uF!<QzJ-fLE_LbnH>-WME)8)}qn{8o6-k^<sQ23=#$P<&U+1 zB^g}0PkDg1nun-Z_&^6Gx*bKpy;esSu(LqjPf%OC0MtEDc=6T%<mpl|3m26LQ0eZX z5&+%jW_;ka6#sS?l>+6X4K*qe;9YQ_({3Q+I-oV<37*~AsO$T|YxxCWYxz4pU<Jl0 zkM3J9wmtm+zuQ~FBl*L(gH5I4FYY}CH9SE36u?spC;q=Q0X4%8I+XCfI0Tjh4|hE> z{{QVDV~J#EHOIGu0{ktYPylTcY<~F9qm#MQTcX=pqO+Q#`N8|<6HJ}X5-Y(A%k^Iv z?*sMX!HdyL_+F?&cnP3|=-l1sUStY`Cpo~)po^f{2WRlC2!9KxFVd~;(H$(Hoh{(e z>%{2M$=vO%^8bYO`%Y($I!TxAquu9T>{A4lBd^1oPbzeJOT4rPt<L`UzeKtD-@g($ zkM46G-N!t7MGrg!EuMug{5=`r!OU~$HM>VIuf%Z%hHs7>3MJykm%7in^g1!U5Cv_L zY5wt_zvVr6V%A%r%SFYYgYmW4UQlrgN+1T^=UlpvzHkOxZT*+O_2|F<|M|CpPM_%p z<%;ec&}1&C%?2(0AZ0dq`oO0%M@0dAWSW6buW83c1_sa(BA(sHtT{@!K?kKA5NQ4_ zUi7i~w>W?E6;Q(*bmroV|Db`1AB_Ahpf>qVu+SSDaDw4&wzWJ4YA&}VGBPkU{s%Rh z`CDdzYOY>ei3bb}j(bIzK|M@X?zx~s;=E_~)fX*hAiX7`=;M_yZr=y>n?!%!XJCMw z<z;;G80$Mwm+QZ%@+6R^QbV6!))jNWBVL#8GcfG>4eB@;<1(-dY#{H7`wR>(W(hGc zcz_PT_+eA#=F!VL86?;W66_UidIWZ(H`rhwi+he>PkLxye8B+O<bml{eei+>R*^ZN zwZvCJrJ1J*$c0$E#R5{AeAu%aq|BH3fPc5kF^(5fxRhT7jobH%PMQr01px)nIVtB~ zbXYPlymsCB1++j@G=Cx}EPsF+X-436BRU?*w>_9|dv^QW<9M-A5agtgdmNDP1r0KJ z_;ere098z^lR!Gbt$J{SK1T)8ppOHUqo6hb*yAtwtU<*kV~IF~`yaf!uT-|#*5?QV z17oSkPEb6*Sn~J(fAD_G7qdVUr{E*KAoU!0Lv62@#EY-s$rbQEu{zLUJe{nUL38w- ztVcjp>+Mq3UT2BdY@q!W;0^=m7!X)`h0o<69rO3`Mg1{wUBuh{l!4)e9cWc#_XCe^ z-VzX3A7n-M4NvPM{7s<trAPM<PwhWGz4;uT&3`%gn_3t^A#>(MJt&uTfAF+ES{$+q zykW%pkO#lh1rO#69@ZC%1VMAq`yYTRa}VporBbh%jBk7NhADVhUn_D0$t?!?%KC7L zrN_bl%pScmKR`<q=Y0e9x>!Fy0oifxML(F!?9uDZ@uC^bX1xHGx(71u#gU_+$_G56 z1f8?(t^tiqBcB8aijNoIasV_b`u)cL6QGvZVMzFZ+cO@$vd*BP++JIorMUKLB3eSA zF(PPD+$$>$(I-NxzQgAj81{oEy+G$Pt@;Y`Gc$O9YV&)>(%0YtG|+kr@B$L(u4548 z(S2|yWYZo;2{UL1aI%Mu2lENz1C5rTy?UiQyC56%0wwsT9Qb_rj8C$ojjQoVpYBUO z%m*F$w>yZq@^6n|^Xm0skZ^6iT_V>V$m3&usferFk%Re=kM)Hjen-%d@<9z(>(fP# zKsG=c@gU1V=cP5j(eUX$=+n!)X)b63$4S^+w34s(LC@|BpgEonP~)uiKnZ`hgUZ1d z^4~8sKVSq+Y(PRCa^B1fV^CancYyXEfLcK;|1Z8~c+mvf%Lq>Ypg8mB<-G{%5chlm zg$}DGsD}%ZJOtX237MxvZY(Hxbbspp`63Lw;PSQyDE%JhZ|MS+q1_#zR+&#S>q_uW z<%^b9CBmR3-_3^vJPtl!@nAj(O0O?LLU3*|i=|ZwvuF2ZPwUJ4EzY2WF1npKd_m)K zW{jZO%^$3#ygr>#9FDyXe_n!iO?Wo{V1%qf6bD<n8oZFYb2EtQ_F`%N$-&?H0z8*4 zDtZ>wd=@^-z~IPy%D4NJi}l4?Ezg4wSv<O%K~8l94I>{E@a>FY{L#(({0sv_H|x_g z3=GUCT&yqF+-kJyV_-PYy&H4}Ln+VkW)R&B+7(dNXf=U>;Q&mm5hRw>Xf+W@43v3a z`!!lkMiOfUsk3Ud>O~R*om22yt<kC<Ner|S;I&Yr)g+J@7sOsr`>A^}$OYit0gnGK zbb{UWnjIWC|1WrSf&=2^W6-wP1CW%BvDwO_lQ$65-S6ZD&wF(8219rucNiGJWokFC z;~fTums380(n1Vqdb&gfb?bBYP4Lo%0^@Jp7n@%(@wb46p}>qqpwVQI2&l0R76Gl% zYktMd-_j12Vkz-$e#KUz)BKCEB>u&eTcDN{Xb8tcu|x&=?5|Zf|NjTAGQ9{&4ZW(% zL1U8LybEqKFo4&2cGjpAyaXQz(yKZfA~yv^t`8LZy{hF9xdLRl*QGD!fc)0|0o<tp z*^&)TMH4{j!K3?>PcrN4Qw$82ku0DQ{euGV#CpiX`b5zS6mBsqNEwsyNuS<C4&QDa zmDln<y{aE>fhsNDm$#6d`@;DnXhqBm&*s03rR>HBUVdX>VDN2yTgv6w>&yH?^YH)w zXIlT4a2TI_aq_|c{}Y;jbCifR|K=_cZ2rws!s7$l1?bXUqEhhM(5HJJD5d*!f;R>( z1F;#Je{+-yyL4{@C6D86AhHLP)L6k<K$4c-yr6yB-4{E3R1CUV8Bc-II4CoCB%ktN zKIzfj2KIh)$_Wn0;GaP^?~RiT46iT0sQvK&KWNcu>;DpV<C8D6?*IS4AGCAV`hF>I z_cV}Q-RB+uUwzHmecJK=RqOjDTp)L|HveWR74qo>yVd%BDZ5K2*mcGSKy7db&+cdo z&+cLe_<~JG$T^B0oxC@1GB6zW=;VEfLN~v$_%F)V1wQbi(?vz$wUn(mD0gs!bHjhp z!=0d|(6?PcGgFYWE<j5;&v<n5t^}C_sprAnQ{EXj85mw{1`Rs49w-q2Z>nfLP{I!B zDKR0{>&<U8Jh~YhEx<c!wVNv>SV~p99TaR8SSL%Ch}tTGC_Y;y5XElG;4qW1l<h_P zumAtgfXx6M%>`ad=+Vo&5!?=%-T_*j2rixxb(`^jOWU%$pe<Q1!e4_bSy>Oz6i+Yf z?jF!WgxencE;kyi70NjqtQks-TmP46Hdrf_avC3K{m(z;K=%*+ZQL))9)f$3%%J@q z{|~>uV53mZ>GA(?7jw&j($AoyM-Y`NsBXb5(+!$!KZ158m$JUN^a|{V+h-U+=ft+& zE|mu5k&_Gz3^ukUO#hFAdYS(~qvX9Y%#2_gp7**lf?H6alM*+Br=EUzbh1XC0lEJ` z$pMdU+1@h@3?TQXf^;8X2XSnB3m8kBJ(Aynry)UW`YJ$LJJ~_a#3ImoS5W)�xfU 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 V{_})^Apq177}AZ{QOA=T0ss*!rV{`F literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/gui.exe b/Teletype/venv/lib/python3.7/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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�(EZ;pR)d)<K-w0p1$kd5E*4TX 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/launch.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/launch.py new file mode 100644 index 0000000..308283e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +Launch the Python script on the command line after +setuptools is bootstrapped via import. +""" + +# Note that setuptools gets imported implicitly by the +# invocation of this script using python -m setuptools.launch + +import tokenize +import sys + + +def run(): + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] + + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) + + +if __name__ == '__main__': + run() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 0000000..4b1a73f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +Customized Mixin2to3 support: + + - adds support for converting doctests + + +This module raises an ImportError on Python 2. +""" + +from distutils.util import Mixin2to3 as _Mixin2to3 +from distutils import log +from lib2to3.refactor import RefactoringTool, get_fixers_from_package + +import setuptools + + +class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + +class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests=False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing " + " ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: + return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/monkey.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..3c77f8c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/monkey.py @@ -0,0 +1,179 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +from importlib import import_module +import inspect + +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def _get_mro(cls): + """ + Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. + """ + if platform.python_implementation() == "Jython": + return (cls,) + cls.__bases__ + return inspect.getmro(cls) + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in _get_mro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = sys.version_info <= (3, 5, 3) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata(): + """Patch write_pkg_file and read_pkg_file for higher metadata standards""" + for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'): + new_val = getattr(setuptools.dist, attr) + setattr(distutils.dist.DistributionMetadata, attr, new_val) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/msvc.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..b9c472f --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/msvc.py @@ -0,0 +1,1301 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from setuptools.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +_msvc9_suppress_errors = ( + # msvc9compiler isn't available on some platforms + ImportError, + + # msvc9compiler raises DistutilsPlatformError in some + # environments. See #1118. + distutils.errors.DistutilsPlatformError, +) + +try: + from distutils.msvc9compiler import Reg +except _msvc9_suppress_errors: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'https://visualstudio.microsoft.com/downloads/') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + r""" + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + r""" + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + + def _find_latest_available_vc_ver(self): + try: + return self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + ms = self.ri.microsoft + vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + self.VSInstallDir + + guess_vc = self._guess_vc() or self._guess_vc_legacy() + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + def _guess_vc(self): + """ + Locate Visual C for 2017 + """ + if self.vc_ver <= 14.0: + return + + default = r'VC\Tools\MSVC' + guess_vc = os.path.join(self.VSInstallDir, default) + # Subdir with VC exact version as name + try: + vc_exact_ver = os.listdir(guess_vc)[-1] + return os.path.join(guess_vc, vc_exact_ver) + except (OSError, IOError, IndexError): + pass + + def _guess_vc_legacy(self): + """ + Locate Visual C for versions prior to 2017 + """ + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + return os.path.join(self.ProgramFilesx86, default) + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions for specified MSVC++ version. + """ + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkLastVersion(self): + """ + Microsoft Windows SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.WindowsSdkDir, 'lib')) + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def UniversalCRTSdkLastVersion(self): + """ + Microsoft Universal C Runtime SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.UniversalCRTSdkDir, 'lib')) + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version in registry + reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) + dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) + ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + def _use_last_dir_name(self, path, prefix=''): + """ + Return name of the last dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Use dirs in this path + prefix: str + Use only dirs startings by this prefix + """ + matching_dirs = ( + dir_name + for dir_name in reversed(os.listdir(path)) + if os.path.isdir(os.path.join(path, dir_name)) and + dir_name.startswith(prefix) + ) + return next(matching_dirs, None) or '' + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=0): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + if self.vc_ver >= 15.0: + arch_subdir = self.pi.target_dir(x64=True) + else: + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver == 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + elif self.vc_ver >= 15.0: + host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else + r'bin\HostX64%s') + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] + + if self.pi.current_cpu != self.pi.target_cpu: + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._sdk_subdir + return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._sdk_subdir + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + return list(self._sdk_tools()) + + def _sdk_tools(self): + """ + Microsoft Windows SDK Tools paths generator + """ + if self.vc_ver < 15.0: + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + yield os.path.join(self.si.WindowsSdkDir, bin_dir) + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + elif self.vc_ver >= 15.0: + path = os.path.join(self.si.WindowsSdkDir, 'Bin') + arch_subdir = self.pi.current_dir(x64=True) + sdkver = self.si.WindowsSdkLastVersion + yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + + if self.si.WindowsSDKExecutablePath: + yield self.si.WindowsSDKExecutablePath + + @property + def _sdk_subdir(self): + """ + Microsoft Windows SDK version subdir + """ + ucrtver = self.si.WindowsSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + elif self.vc_ver < 15.0: + base_path = self.si.ProgramFilesx86 + arch_subdir = self.pi.current_dir(hidex86=True) + else: + base_path = self.si.VSInstallDir + arch_subdir = '' + + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + build = [os.path.join(base_path, path)] + + if self.vc_ver >= 15.0: + # Add Roslyn C# & Visual Basic Compiler + build += [os.path.join(base_path, path, 'Roslyn')] + + return build + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal C Runtime SDK Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._ucrt_subdir + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal C Runtime SDK Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + + @property + def _ucrt_subdir(self): + """ + Microsoft Universal C Runtime SDK version subdir + """ + ucrtver = self.si.UniversalCRTSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + if self.vc_ver < 15: + redist_path = self.si.VCInstallDir + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + else: + redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') + vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + + # Visual Studio 2017 is still Visual C++ 14.0 + dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + + vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) + return os.path.join(redist_path, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/namespaces.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..dc16106 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/package_index.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/package_index.py new file mode 100644 index 0000000..705a47c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/package_index.py @@ -0,0 +1,1136 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 +import hashlib +import itertools +import warnings +from functools import wraps + +from setuptools.extern import six +from setuptools.extern.six.moves import urllib, http_client, configparser, map + +import setuptools +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, EGG_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from fnmatch import translate +from setuptools.py27compat import get_all_headers +from setuptools.py33compat import unescape +from setuptools.wheel import Wheel + +__metaclass__ = type + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') +HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) +PYPI_MD5 = re.compile( + r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)' + r'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py', -16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py', -20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base, py_ver, plat + + +def egg_info_for_url(url): + parts = urllib.parse.urlparse(url) + scheme, server, path, parameters, query, fragment = parts + base = urllib.parse.unquote(path.split('/')[-1]) + if server == 'sourceforge.net' and base == 'download': # XXX Yuck + base = urllib.parse.unquote(path.split('/')[-2]) + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): + yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence=CHECKOUT_DIST + ): + yield dist + + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.whl') and '-' in basename: + wheel = Wheel(basename) + if not wheel.is_compatible(): + return [] + return [Distribution( + location=location, + project_name=wheel.project_name, + version=wheel.version, + # Increase priority over eggs. + precedence=EGG_DIST + 1, + )] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None +): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): + # it is a bdist_dumb, not an sdist -- bail out + return + + for p in range(1, len(parts) + 1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence=precedence, + platform=platform + ) + + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in six.moves.filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + + return wrapper + + +REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos != -1: + match = HREF.search(page, pos) + if match: + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + +class ContentChecker: + """ + A null content checker that defines the interface for checking content + """ + + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urllib.parse.urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.org/simple/", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate, hosts))).match + self.to_scan = [] + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: + self.opener = ssl_support.opener_for(ca_bundle) + else: + self.opener = urllib.request.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): + # In Python 3 and got bytes but want str. + if isinstance(f, urllib.error.HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urllib.parse.urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path, item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): + return True + msg = ( + "\nNote: Bypassing %s (disallowed host; see " + "http://bit.ly/2hrImnY for details).\n") + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + dirs = filter(os.path.isdir, search_path) + egg_links = ( + (path, entry) + for path in dirs + for entry in os.listdir(path) + if entry.endswith('.egg-link') + ) + list(itertools.starmap(self.scan_egg_link, egg_links)) + + def scan_egg_link(self, path, entry): + with open(os.path.join(path, entry)) as raw_lines: + # filter non-empty lines + lines = list(filter(None, map(str.strip, raw_lines))) + + if len(lines) != 2: + # format is not recognized; punt + return + + egg_path, setup_path = lines + + for dist in find_distributions(os.path.join(path, egg_path)): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self, url, page): + """Process the contents of a PyPI page""" + + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + urllib.parse.unquote, link[len(self.index_url):].split('/') + )) + if len(parts) == 2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(), {})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url += '#egg=%s-%s' % (pkg, ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: + self.warn(msg, *args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name + '/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name + '/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key, ())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement, installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report( + self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" + % (checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = ( + self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec, Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found, fragment, tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence == DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn( + "Skipping development or system egg: %s", dist, + ) + skipped[dist] = 1 + continue + + test = ( + dist in req + and (dist.precedence <= SOURCE_DIST or not source) + ) + if test: + loc = self.download(dist.location, tmpdir) + dist.download_location = loc + if os.path.exists(dist.download_location): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if not dist and local_index is not None: + dist = find(requirement, local_index) + + if dist is None: + if self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or working download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=dist.download_location) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists) == 1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename = dst + + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment, dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp = None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(url) + if isinstance(fp, urllib.error.HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code, fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + with open(filename, 'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: + fp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, http_client.InvalidURL) as v: + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib.error.HTTPError as v: + return v + except urllib.error.URLError as v: + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except http_client.BadStatusLine as v: + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except (http_client.HTTPException, socket.error) as v: + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..', '.').replace('\\', '_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir, name) + + # Download the file + # + if scheme == 'svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme == 'git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme == 'file': + return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type', '').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at " + url) + + def _download_svn(self, url, filename): + warnings.warn("SVN download support is deprecated", UserWarning) + url = url.split('#', 1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/', 1) + auth, host = _splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("(cd %s && git checkout --quiet %s)" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("(cd %s && hg up -C -r %s -q)" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def decode_entity(match): + what = match.group(0) + return unescape(what) + + +def htmldecode(text): + """ + Decode HTML entities in the given text. + + >>> htmldecode( + ... 'https://../package_name-0.1.2.tar.gz' + ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') + 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' + """ + return entity_sub(decode_entity, text) + + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + + return _socket_timeout + + return _socket_timeout + + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> str(_encode_auth('username%3Apassword')) + 'dXNlcm5hbWU6cGFzc3dvcmQ=' + + Long auth strings should not cause a newline to be inserted. + >>> long_auth = 'username:' + 'password'*10 + >>> chr(10) in str(_encode_auth(long_auth)) + False + """ + auth_s = urllib.parse.unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + encoded_bytes = base64.b64encode(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.replace('\n', '') + + +class Credential: + """ + A username/password pair. Use like a namedtuple. + """ + + def __init__(self, username, password): + self.username = username + self.password = password + + def __iter__(self): + yield self.username + yield self.password + + def __str__(self): + return '%(username)s:%(password)s' % vars(self) + + +class PyPIConfig(configparser.RawConfigParser): + def __init__(self): + """ + Load from ~/.pypirc + """ + defaults = dict.fromkeys(['username', 'password', 'repository'], '') + configparser.RawConfigParser.__init__(self, defaults) + + rc = os.path.join(os.path.expanduser('~'), '.pypirc') + if os.path.exists(rc): + self.read(rc) + + @property + def creds_by_repository(self): + sections_with_repositories = [ + section for section in self.sections() + if self.get(section, 'repository').strip() + ] + + return dict(map(self._get_repo_cred, sections_with_repositories)) + + def _get_repo_cred(self, section): + repo = self.get(section, 'repository').strip() + return repo, Credential( + self.get(section, 'username').strip(), + self.get(section, 'password').strip(), + ) + + def find_credential(self, url): + """ + If the URL indicated appears to be a repository defined in this + config, return the credential for that repository. + """ + for repository, cred in self.creds_by_repository.items(): + if url.startswith(repository): + return cred + + +def open_with_auth(url, opener=urllib.request.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + parsed = urllib.parse.urlparse(url) + scheme, netloc, path, params, query, frag = parsed + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, address = _splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, address, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == address: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# copy of urllib.parse._splituser from Python 3.8 +def _splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + user, delim, host = host.rpartition('@') + return (user if delim else None), host + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ( + "<html><head><title>{url}" + "{files}") + body = tmpl.format(url=url, files='\n'.join(files)) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + headers = {'content-type': 'text/html'} + body_stream = six.StringIO(body) + return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/pep425tags.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/pep425tags.py new file mode 100644 index 0000000..48745a2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/pep425tags.py @@ -0,0 +1,319 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +from distutils import log +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +from .extern import six + +from . import glibc + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + log.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + six.PY2)) \ + and six.PY2: + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of a macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform 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 abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/py27compat.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/py27compat.py new file mode 100644 index 0000000..2985011 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/py27compat.py @@ -0,0 +1,28 @@ +""" +Compatibility Support for Python 2.7 and earlier +""" + +import platform + +from setuptools.extern import six + + +def get_all_headers(message, key): + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) + + +if six.PY2: + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + six.PY2 +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/py31compat.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/py31compat.py new file mode 100644 index 0000000..1a0705e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/py31compat.py @@ -0,0 +1,32 @@ +__all__ = [] + +__metaclass__ = type + + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + + class TemporaryDirectory: + """ + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + + def __init__(self): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp() + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/py33compat.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..87cf539 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/py33compat.py @@ -0,0 +1,55 @@ +import dis +import array +import collections + +try: + import html +except ImportError: + html = None + +from setuptools.extern import six +from setuptools.extern.six.moves import html_parser + +__metaclass__ = type + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat: + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) + + +unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/sandbox.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000..685f3f7 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +import os +import sys +import tempfile +import operator +import functools +import itertools +import re +import contextlib +import pickle +import textwrap + +from setuptools.extern import six +from setuptools.extern.six.moves import builtins, map + +import pkg_resources.py31compat + +if sys.platform.startswith('java'): + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + with open(filename, mode) as stream: + script = stream.read() + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(repl=None): + saved = sys.argv[:] + if repl is not None: + sys.argv[:] = repl + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + pkg_resources.py31compat.makedirs(replacement, exist_ok=True) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + + @staticmethod + def dump(type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + # get UnpickleableException inside the sandbox + from setuptools.sandbox import UnpickleableException as cls + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + six.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + >>> _needs_hiding('os') + False + >>> _needs_hiding('Cython') + True + """ + pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + with setup_context(setup_dir): + try: + sys.argv[:] = [setup_script] + list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + with DirectorySandbox(setup_dir): + ns = dict(__file__=dunder_file, __name__='__main__') + _execfile(setup_script, ns) + except SystemExit as v: + if v.args and v.args[0]: + raise + # Normal exit, just return + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self, name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source, name)) + + def __enter__(self): + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + + def __exit__(self, exc_type, exc_value, traceback): + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def run(self, func): + """Run 'func' under os sandboxing""" + with self: + return func() + + def _mk_dual_path_wrapper(name): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): + if self._active: + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) + if self._active: + return self._remap_output(name, retval) + return retval + + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os, name): + locals()[name] = _mk_query(name) + + def _validate_path(self, path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self, operation, path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + _exception_patterns = [ + # Allow lib2to3 to attempt to save a pickled grammar object (#121) + r'.*lib2to3.*\.pickle$', + ] + "exempt writing to paths that match the pattern" + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox, '') + self._exceptions = [ + os.path.normcase(os.path.realpath(path)) + for path in exceptions + ] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + from setuptools.sandbox import SandboxViolation + raise SandboxViolation(operation, args, kw) + + if _file: + + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path, mode, *args, **kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path, mode, *args, **kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self, path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + return ( + self._exempted(realpath) + or realpath == self._sandbox + or realpath.startswith(self._prefix) + ) + finally: + self._active = active + + def _exempted(self, filepath): + start_matches = ( + filepath.startswith(exception) + for exception in self._exceptions + ) + pattern_matches = ( + re.match(pattern, filepath) + for pattern in self._exception_patterns + ) + candidates = itertools.chain(start_matches, pattern_matches) + return any(candidates) + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src, dst) + + def open(self, file, flags, mode=0o777, *args, **kw): + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + + +WRITE_FLAGS = functools.reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + tmpl = textwrap.dedent(""" + SandboxViolation: {cmd}{args!r} {kwargs} + + The package setup script has attempted to modify files on your system + that are not within the EasyInstall build area, and has been aborted. + + This package cannot be safely installed by EasyInstall, and may not + support alternate installation locations even if you run its setup + script by hand. Please inform the package's author and the EasyInstall + maintainers to find out if a fix or workaround is available. + """).lstrip() + + def __str__(self): + cmd, args, kwargs = self.args + return self.tmpl.format(**locals()) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl b/Teletype/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000..39a24b0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,6 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +with open(__file__) as f: + exec(compile(f.read(), __file__, 'exec')) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/script.tmpl b/Teletype/venv/lib/python3.7/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000..ff5efbc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/site-patch.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/site-patch.py new file mode 100644 index 0000000..40b00de --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python 3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/ssl_support.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000..226db69 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/ssl_support.py @@ -0,0 +1,260 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + https://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = 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") + 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") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + if hasattr(ssl, 'create_default_context'): + ctx = ssl.create_default_context(cafile=self.ca_bundle) + self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) + else: + # This is for python < 2.7.9 and < 3.4? + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000..3b8179a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,57 @@ +import unicodedata +import sys +import re + +from setuptools.extern import six + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, six.text_type): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + if isinstance(path, six.text_type): + return path + + fs_enc = sys.getfilesystemencoding() or 'utf-8' + candidates = fs_enc, 'utf-8' + + for enc in candidates: + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None + + +CODING_RE = re.compile(br'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)') + + +def detect_encoding(fp): + first_line = fp.readline() + fp.seek(0) + m = CODING_RE.match(first_line) + if m is None: + return None + return m.group(1).decode('ascii') diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/version.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/version.py new file mode 100644 index 0000000..95e1869 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/wheel.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/wheel.py new file mode 100644 index 0000000..e11f0a1 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/wheel.py @@ -0,0 +1,211 @@ +"""Wheels support.""" + +from distutils.util import get_platform +import email +import itertools +import os +import posixpath +import re +import zipfile + +import pkg_resources +import setuptools +from pkg_resources import parse_version +from setuptools.extern.packaging.utils import canonicalize_name +from setuptools.extern.six import PY3 +from setuptools import pep425tags +from setuptools.command.egg_info import write_requirements + + +__metaclass__ = type + + +WHEEL_NAME = re.compile( + r"""^(?P.+?)-(?P\d.*?) + ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) + )\.whl$""", + re.VERBOSE).match + +NAMESPACE_PACKAGE_INIT = '''\ +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + __path__ = __import__('pkgutil').extend_path(__path__, __name__) +''' + + +def unpack(src_dir, dst_dir): + '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' + for dirpath, dirnames, filenames in os.walk(src_dir): + subdir = os.path.relpath(dirpath, src_dir) + for f in filenames: + src = os.path.join(dirpath, f) + dst = os.path.join(dst_dir, subdir, f) + os.renames(src, dst) + for n, d in reversed(list(enumerate(dirnames))): + src = os.path.join(dirpath, d) + dst = os.path.join(dst_dir, subdir, d) + if not os.path.exists(dst): + # Directory does not exist in destination, + # rename it and prune it from os.walk list. + os.renames(src, dst) + del dirnames[n] + # Cleanup. + for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): + assert not filenames + os.rmdir(dirpath) + + +class Wheel: + + def __init__(self, filename): + match = WHEEL_NAME(os.path.basename(filename)) + if match is None: + raise ValueError('invalid wheel name: %r' % filename) + self.filename = filename + for k, v in match.groupdict().items(): + setattr(self, k, v) + + def tags(self): + '''List tags (py_version, abi, platform) supported by this wheel.''' + return itertools.product( + self.py_version.split('.'), + self.abi.split('.'), + self.platform.split('.'), + ) + + def is_compatible(self): + '''Is the wheel is compatible with the current platform?''' + supported_tags = pep425tags.get_supported() + return next((True for t in self.tags() if t in supported_tags), False) + + def egg_name(self): + return pkg_resources.Distribution( + project_name=self.project_name, version=self.version, + platform=(None if self.platform == 'any' else get_platform()), + ).egg_name() + '.egg' + + def get_dist_info(self, zf): + # find the correct name of the .dist-info dir in the wheel file + for member in zf.namelist(): + dirname = posixpath.dirname(member) + if (dirname.endswith('.dist-info') and + canonicalize_name(dirname).startswith( + canonicalize_name(self.project_name))): + return dirname + raise ValueError("unsupported wheel format. .dist-info not found") + + def install_as_egg(self, destination_eggdir): + '''Install wheel as an egg directory.''' + with zipfile.ZipFile(self.filename) as zf: + self._install_as_egg(destination_eggdir, zf) + + def _install_as_egg(self, destination_eggdir, zf): + dist_basename = '%s-%s' % (self.project_name, self.version) + dist_info = self.get_dist_info(zf) + dist_data = '%s.data' % dist_basename + egg_info = os.path.join(destination_eggdir, 'EGG-INFO') + + self._convert_metadata(zf, destination_eggdir, dist_info, egg_info) + self._move_data_entries(destination_eggdir, dist_data) + self._fix_namespace_packages(egg_info, destination_eggdir) + + @staticmethod + def _convert_metadata(zf, destination_eggdir, dist_info, egg_info): + def get_metadata(name): + with zf.open(posixpath.join(dist_info, name)) as fp: + value = fp.read().decode('utf-8') if PY3 else fp.read() + return email.parser.Parser().parsestr(value) + + wheel_metadata = get_metadata('WHEEL') + # Check wheel format version is supported. + wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) + wheel_v1 = ( + parse_version('1.0') <= wheel_version < parse_version('2.0dev0') + ) + if not wheel_v1: + raise ValueError( + 'unsupported wheel format version: %s' % wheel_version) + # Extract to target directory. + os.mkdir(destination_eggdir) + zf.extractall(destination_eggdir) + # Convert metadata. + dist_info = os.path.join(destination_eggdir, dist_info) + dist = pkg_resources.Distribution.from_location( + destination_eggdir, dist_info, + metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), + ) + + # Note: Evaluate and strip markers now, + # as it's difficult to convert back from the syntax: + # foobar; "linux" in sys_platform and extra == 'test' + def raw_req(req): + req.marker = None + return str(req) + install_requires = list(sorted(map(raw_req, dist.requires()))) + extras_require = { + extra: sorted( + req + for req in map(raw_req, dist.requires((extra,))) + if req not in install_requires + ) + for extra in dist.extras + } + os.rename(dist_info, egg_info) + os.rename( + os.path.join(egg_info, 'METADATA'), + os.path.join(egg_info, 'PKG-INFO'), + ) + setup_dist = setuptools.Distribution( + attrs=dict( + install_requires=install_requires, + extras_require=extras_require, + ), + ) + write_requirements( + setup_dist.get_command_obj('egg_info'), + None, + os.path.join(egg_info, 'requires.txt'), + ) + + @staticmethod + def _move_data_entries(destination_eggdir, dist_data): + """Move data entries to their correct location.""" + dist_data = os.path.join(destination_eggdir, dist_data) + dist_data_scripts = os.path.join(dist_data, 'scripts') + if os.path.exists(dist_data_scripts): + egg_info_scripts = os.path.join( + destination_eggdir, 'EGG-INFO', 'scripts') + os.mkdir(egg_info_scripts) + for entry in os.listdir(dist_data_scripts): + # Remove bytecode, as it's not properly handled + # during easy_install scripts install phase. + if entry.endswith('.pyc'): + os.unlink(os.path.join(dist_data_scripts, entry)) + else: + os.rename( + os.path.join(dist_data_scripts, entry), + os.path.join(egg_info_scripts, entry), + ) + os.rmdir(dist_data_scripts) + for subdir in filter(os.path.exists, ( + os.path.join(dist_data, d) + for d in ('data', 'headers', 'purelib', 'platlib') + )): + unpack(subdir, destination_eggdir) + if os.path.exists(dist_data): + os.rmdir(dist_data) + + @staticmethod + def _fix_namespace_packages(egg_info, destination_eggdir): + namespace_packages = os.path.join( + egg_info, 'namespace_packages.txt') + if os.path.exists(namespace_packages): + with open(namespace_packages) as fp: + namespace_packages = fp.read().split() + for mod in namespace_packages: + mod_dir = os.path.join(destination_eggdir, *mod.split('.')) + mod_init = os.path.join(mod_dir, '__init__.py') + if os.path.exists(mod_dir) and not os.path.exists(mod_init): + with open(mod_init, 'w') as fp: + fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/Teletype/venv/lib/python3.7/site-packages/setuptools/windows_support.py b/Teletype/venv/lib/python3.7/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/INSTALLER b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +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. diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/METADATA b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/METADATA new file mode 100644 index 0000000..2354dd4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.33.1 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/RECORD b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/RECORD new file mode 100644 index 0000000..273fbf2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/RECORD @@ -0,0 +1,32 @@ +../../../bin/wheel,sha256=wOiUt41UKZynuVsEoR8AjXbx5D_Q4whRCzjqK9HJBPM,279 +wheel-0.33.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.33.1.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.33.1.dist-info/METADATA,sha256=ZKo4q8P_vXXg-OGjDZGlaIf4gafusgkeCd6jDxbrJLA,2082 +wheel-0.33.1.dist-info/RECORD,, +wheel-0.33.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +wheel-0.33.1.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.33.1.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel/__init__.py,sha256=OyOAcqlvJaBEASYRGijJyAkY_HL_5HR3alvjO5BEwKg,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/__pycache__/__init__.cpython-37.pyc,, +wheel/__pycache__/__main__.cpython-37.pyc,, +wheel/__pycache__/bdist_wheel.cpython-37.pyc,, +wheel/__pycache__/metadata.cpython-37.pyc,, +wheel/__pycache__/pep425tags.cpython-37.pyc,, +wheel/__pycache__/pkginfo.cpython-37.pyc,, +wheel/__pycache__/util.cpython-37.pyc,, +wheel/__pycache__/wheelfile.cpython-37.pyc,, +wheel/bdist_wheel.py,sha256=x2beC81u8AzTNVLwD36EPkVX5AxAYs2q70N09BxvMN0,14756 +wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572 +wheel/cli/__pycache__/__init__.cpython-37.pyc,, +wheel/cli/__pycache__/convert.cpython-37.pyc,, +wheel/cli/__pycache__/pack.cpython-37.pyc,, +wheel/cli/__pycache__/unpack.cpython-37.pyc,, +wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 +wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699 +wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924 +wheel/wheelfile.py,sha256=U_13q1XpVt02704XXkFRzmUbz_0R9-GgNxMOZFP3tOs,7168 diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/WHEEL b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/top_level.txt b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel-0.33.1.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/__init__.py b/Teletype/venv/lib/python3.7/site-packages/wheel/__init__.py new file mode 100644 index 0000000..745cefc --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.33.1" diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/__main__.py b/Teletype/venv/lib/python3.7/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d462747bb1c75aec726620123fb8e4a8dd6b7345 GIT binary patch literal 210 zcmZ?b<>g{vU|`Vf?~F-cU|@I*;=nK?0|SEt0|P@b2Ll5`3PTh_3S%&XCQ}ugfu6Ck zo}r&6<1Oy^__EZZ;>`TK`1q9!MNA9~5aL&=enC-YSz<}5epzCXep-G`N@`KDzLBxM zv6-1!xkZVkd2wERiiJ_GWs0S#iLq(9fq{WRdVzk3enDn|Zf0I_Nn%cpu7yEvc1E^Q mj(&MYYATG3kI&4@EQycTE2zB1VUwGmQks)$2eP>sg{vU|`Vf?~GZ<$iVOz#DQUE1_lNP1_p*=9R>!56ox2<6vh;$9L6Zd6y_9` z7KSLMROS@cY^EZORK^7?sZ7lb3mF+1Qka4nG})>wxxzD2Q*#uO^K)|(^HLOYGV@Xu zO7in_6f{!v5|eUL6$&a#GV=2jbaNHT!77U@^GXscG`U`atoKU>ksu6m1S z0SpWbB@8Ky*-S+yDNHF0IgGUoH4Iry3z#8f3Clvpg^aa~HH_(uC9GLYDNHF$txPry zV6|+uOeL%f*lU=wI2Ld&ggBNVm_d`-?-oN5BPbBKZgI!Q7bGTUC#I*y$KPVlFV-ta zEXlaV0w&p0GK=yOb5n0|#K)&)=73Z%7grWXaf02imztn3K7DcmL-;?>X#)J>8IuAq@)%V>l+#C8=IM#m0Ofp zniuEAr&t)}TBcZmn7!o=vo-$W@ls@<>-UWhLZ8| zAgkl!^$IGBxEUB2I6xuC0}4w<4kivp5k>(<4o0vH$R`lBnyk0jjK7jZH$KpYNsJ%r$AU|_h#VUwGmQks)$2a2a+kX9BZ4rUH64n_b&nwgdW literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ee49c448f7ce25de31304a7049b6a0328a37e9f GIT binary patch literal 10094 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 literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57ba129fdbf43a3b23cfd5e2e44910a0546b7cda GIT binary patch literal 1581 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 agAoBC!vZ{v0!%C{T+9Lj9A+Hu98myMb)8uN literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f29eab33eba8dfe1adc090169e30ffdb73b8d949 GIT binary patch literal 2510 zcmZ?b<>g{vU|`Vf?~J+5!NBks#DQUE1_lNP1_p-WAO;486owSW9EM!RC`LvQn<I!rsCV z#goDm%%I8f5@eGm<1M~|qRhOK__WfzmwTU_B8si`@xMMe2VnvAzN!92Ij zoYX3_I1T#%o4mx_)UwnfI~dzePupHo7sLaJ#-!+J*=uUX=%r*9m*{5ZrRA$6gFFMW zj*o$Xfs=uO0mLs(VPs%vXGmjAVN79a;V5BPz}UgCkkN&qnX#6+gsFzPnK6Yqo2AI4 zggJ#}0Sid3nX!p6PpF2u*sX*)g%u%I!<@n<$xzEu!n%O1hGik+0`?U4g^abVHB3c$ zHLNKdHB90R<_xv0B^)ITS)2>FIv8qLQaBefH#7FD)v~2~6aE26~K!zZO2!;~w6y6lR7KR#jklJR(T8es2| zE#XZOS-?`mvyd@GG)1hJiIJg%FN=SHz(NK_h8o@lf}qf0WI%E$Z;E&`D6#MaGiXXA zIx#XZ1f>=vCTA-oDijo@mSyIb7Uxtdl;(lNQd1PlK@qNyl3A3RT#{c@sgRjhlCO}c zke6Bxl}gLZN!8=xQczG(2+2rQKt!&7xQDB&j{-~Gn4q`P}KPX`-Bq!!6B&8~(q?V)>v;R!w{=c%UHsY z#khb8Ofq*c)G#h&TF6+$Qo^!;wT2PIs$rbSRLBy{u#!QO?G{sh@hz5u#FC6#teM3r znMJo)vhp+YZt=Ky28YCZ`nmbX2f5y2%}p#x&d_AK#iVC&izzJ+lpo>IRK&`_!0;V1_p);6i2Zq zCS`);ZgCdmB$j}@Q5?lyl9&$40=Kxpg-1N7P>W(JPXi|{O-8V5z=;b~-X&-Af+7g{vU|`Vf?~GZ<#K7g)xdfg(;Xplk+9WG)=}^d<8|Bc_r~_ zrFqFEnfZBsFPT8rGT!10&qz(pam&m}y~U`P3=#xsU}a!n;ACK6a0XeQz`(#z!cfD| z%-HW%%T&XZ#khbeg>fNcEprKT7Rv(G8paytg-o?9C2T273)pK|7BYey)XT)kP{NVL zxqxdS10zEX(*kag3?oB0LkepkLl8p*LkU|7TQkTzticSL>{Wk4^9mA^vlS8*%0W)j z!0Cr2SERiPBDG&Mz`BwwLACAGMuR=+wgF*mhVx4JB~ zs8$DLL{X{&L=0?BX0bv^MydkHhQ#z#1(0He#Jm&*uzH2el46Cj)S}|d{5+_=Rt1Sg ziMa{|i6t3U3L#*fB^e;=K&C()2y!1(9mow<3NER|C7F4Npa51#$t+4uF3B&dRM1FC zO-n4zDFNwDE-fkoc?2%2sRwr6Eq0KL%2JD}gdxF@nU}6ml5eF@U8|?3cZ)%j@fLGx zUW(r>CVy{Do+1_o28Jm9g2bZY)Rg$N%$!t^?pv(sMfs%#x0v#aZ?S+Jev2h5KQr$Z zD>&+Jv8Ck~sn99?N*g%$XgSb$?tz;+?Wnf_Vm9AepSfrnppOcbWRIG1gtZ!^) zW>#)dVrgES7oTEblxvw{X=-9@T5e!qV31y*AEIB7S)iMlR}8XG*TNt-J0sgDM;{!j zP%=3uQy&t^dIgoY*dR<$iY(>>rB6;SMjl2!Mj=KnMiHhWad1*D0wr2aj$2&u@oA+c zrA4Xn@kOBYe2YE5SPv8&McfPw3`GJU-*AHM0tFm6D8VLx{e(n_fkJ`9CO1E&G$+-L T5tI`+7#J9Mm^c_Yn0S~0U_1;G literal 0 HcmV?d00001 diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/cli/convert.py b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/convert.py new file mode 100644 index 0000000..f1a793a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/convert.py @@ -0,0 +1,269 @@ +import os.path +import re +import shutil +import sys +import tempfile +import zipfile +from distutils import dist +from glob import iglob + +from ..bdist_wheel import bdist_wheel +from ..wheelfile import WheelFile +from . import WheelError, require_pkgresources + +egg_info_re = re.compile(r''' + (?P.+?)-(?P.+?) + (-(?Ppy\d\.\d) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/cli/pack.py b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..af6e81c --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/pack.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir, build_number): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Add the build number if specific + if build_number: + name_version += '-' + build_number + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/cli/unpack.py b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/metadata.py b/Teletype/venv/lib/python3.7/site-packages/wheel/metadata.py new file mode 100644 index 0000000..ab0c07e --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(sorted(parsed_requirement.extras)) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/pep425tags.py b/Teletype/venv/lib/python3.7/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..13b5073 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/pep425tags.py @@ -0,0 +1,185 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import get_all_suffixes +except ImportError: + from imp import get_suffixes as get_all_suffixes + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/pkginfo.py b/Teletype/venv/lib/python3.7/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/util.py b/Teletype/venv/lib/python3.7/site-packages/wheel/util.py new file mode 100644 index 0000000..0afb54a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/util.py @@ -0,0 +1,46 @@ +import base64 +import io +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + StringIO = io.BytesIO + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + StringIO = io.StringIO + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/Teletype/venv/lib/python3.7/site-packages/wheel/wheelfile.py b/Teletype/venv/lib/python3.7/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..9a1c8d2 --- /dev/null +++ b/Teletype/venv/lib/python3.7/site-packages/wheel/wheelfile.py @@ -0,0 +1,168 @@ +from __future__ import print_function + +import csv +import hashlib +import os.path +import re +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = st.st_mode << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(data.getvalue())) + + ZipFile.close(self) diff --git a/Teletype/venv/lib/python3.7/site.py b/Teletype/venv/lib/python3.7/site.py new file mode 100644 index 0000000..dc9887a --- /dev/null +++ b/Teletype/venv/lib/python3.7/site.py @@ -0,0 +1,833 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import os +import sys + +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") +_is_jython = sys.platform[:4] == "java" +if _is_jython: + ModuleType = type(os) + + +def makepath(*paths): + dir = os.path.join(*paths) + if _is_jython and (dir == "__classpath__" or dir.startswith("__pyclasspath__")): + return dir, dir + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + if (_is_jython and not isinstance(m, ModuleType)) or hasattr(m, "__loader__"): + # only modules need the abspath in Jython. and don't mess + # with a PEP 302-supplied __file__ + continue + f = getattr(m, "__file__", None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + + s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "r") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ("os2emx", "riscos") or _is_jython: + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, "site-packages")] + elif sys.platform == "darwin" and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [ + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python"), + ] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] + + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), + ] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) + if sys.version[0] == "2": + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == "darwin": + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if "Python.framework" in prefix: + home = os.environ.get("HOME") + if home: + sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ["BEGINLIBPATH"].split(";") + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ["BEGINLIBPATH"] = ";".join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" + else: + eof = "Ctrl-D (i.e. EOF)" + + class Quitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use {}() or {} to exit".format(self.name, eof) + + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "r") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split("\n") + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,) * 2) + + def __call__(self): + self.__setup() + prompt = "Hit Return for more, or q (and Return) to quit: " + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ("", "q"): + key = None + if key == "q": + break + + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_jython: + builtins.credits = _Printer("credits", "Jython is maintained by the Jython developers (www.jython.org).") + elif _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer( + "credits", + """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""", + ) + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", + "See http://www.python.org/%.3s/license.html" % sys.version, + ["LICENSE.txt", "LICENSE"], + [os.path.join(here, os.pardir), here, os.curdir], + ) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " "or help(object) for help about object." + + def __call__(self, *args, **kwds): + import pydoc + + return pydoc.help(*args, **kwds) + + +def sethelper(): + builtins.help = _Helper() + + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == "win32": + import locale, codecs + + enc = locale.getdefaultlocale()[1] + if enc.startswith("cp"): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = "mbcs" + + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == "": + pos += 1 + if _is_jython: + paths = [os.path.join(sys.real_prefix, "Lib")] + elif _is_pypy: + if sys.version_info > (3, 2): + cpyver = "%d" % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = "%d.%d" % sys.version_info[:2] + else: + cpyver = "%d.%d.%d" % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, "plat-%s" % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == "win32": + paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] + else: + paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, "implementation", sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, "lib-tk") + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == "darwin": + hardcoded_paths = [ + os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") + ] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, "__egginsert", 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + + +def fixclasspath(): + """Adjust the special classpath sys.path entries for Jython. These + entries should follow the base virtualenv lib directories. + """ + paths = [] + classpaths = [] + for path in sys.path: + if path == "__classpath__" or path.startswith("__pyclasspath__"): + classpaths.append(path) + else: + paths.append(path) + sys.path = paths + sys.path.extend(classpaths) + + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + abs__file__() + paths_in_sys = removeduppaths() + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": + addbuilddir() + if _is_jython: + fixclasspath() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == "os2emx": + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + + +main() + + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" {!r},".format(dir)) + print("]") + + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_BASE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if "--user-base" in args: + buffer.append(USER_BASE) + if "--user-site" in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + + +if __name__ == "__main__": + _script() diff --git a/Teletype/venv/lib/python3.7/sre_compile.py b/Teletype/venv/lib/python3.7/sre_compile.py new file mode 120000 index 0000000..25b2b1a --- /dev/null +++ b/Teletype/venv/lib/python3.7/sre_compile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_compile.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/sre_constants.py b/Teletype/venv/lib/python3.7/sre_constants.py new file mode 120000 index 0000000..adacba3 --- /dev/null +++ b/Teletype/venv/lib/python3.7/sre_constants.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_constants.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/sre_parse.py b/Teletype/venv/lib/python3.7/sre_parse.py new file mode 120000 index 0000000..a2167c0 --- /dev/null +++ b/Teletype/venv/lib/python3.7/sre_parse.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_parse.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/stat.py b/Teletype/venv/lib/python3.7/stat.py new file mode 120000 index 0000000..2cb392c --- /dev/null +++ b/Teletype/venv/lib/python3.7/stat.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/struct.py b/Teletype/venv/lib/python3.7/struct.py new file mode 120000 index 0000000..8c93f91 --- /dev/null +++ b/Teletype/venv/lib/python3.7/struct.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/struct.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/tarfile.py b/Teletype/venv/lib/python3.7/tarfile.py new file mode 120000 index 0000000..374c697 --- /dev/null +++ b/Teletype/venv/lib/python3.7/tarfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tarfile.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/tempfile.py b/Teletype/venv/lib/python3.7/tempfile.py new file mode 120000 index 0000000..565f61f --- /dev/null +++ b/Teletype/venv/lib/python3.7/tempfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tempfile.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/token.py b/Teletype/venv/lib/python3.7/token.py new file mode 120000 index 0000000..87ee559 --- /dev/null +++ b/Teletype/venv/lib/python3.7/token.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/token.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/tokenize.py b/Teletype/venv/lib/python3.7/tokenize.py new file mode 120000 index 0000000..c57893e --- /dev/null +++ b/Teletype/venv/lib/python3.7/tokenize.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tokenize.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/types.py b/Teletype/venv/lib/python3.7/types.py new file mode 120000 index 0000000..c400877 --- /dev/null +++ b/Teletype/venv/lib/python3.7/types.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/types.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/warnings.py b/Teletype/venv/lib/python3.7/warnings.py new file mode 120000 index 0000000..d4104e4 --- /dev/null +++ b/Teletype/venv/lib/python3.7/warnings.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/warnings.py \ No newline at end of file diff --git a/Teletype/venv/lib/python3.7/weakref.py b/Teletype/venv/lib/python3.7/weakref.py new file mode 120000 index 0000000..4e646aa --- /dev/null +++ b/Teletype/venv/lib/python3.7/weakref.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/weakref.py \ No newline at end of file diff --git a/Text/__pycache__/classes.cpython-36.pyc b/Text/__pycache__/classes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4878c1e08def71fd99ee5d992387ccadc205bb69 GIT binary patch literal 8237 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 z