From 2e0cb1144e4dc10858eada81de4b8f619422a7bf Mon Sep 17 00:00:00 2001 From: Andrew Davidson Date: Mon, 2 Jan 2023 18:41:19 -0800 Subject: [PATCH] cleanup commit --- venv/bin/activate | 78 + venv/bin/activate.csh | 36 + venv/bin/activate.fish | 76 + venv/bin/activate_this.py | 34 + venv/bin/easy_install | 11 + venv/bin/easy_install-3.6 | 11 + venv/bin/pip | 11 + venv/bin/pip3 | 11 + venv/bin/pip3.6 | 11 + venv/bin/python-config | 78 + venv/bin/python3.6 | Bin 0 -> 13068 bytes venv/bin/wheel | 11 + .../__pycache__/__future__.cpython-36.pyc | Bin 0 -> 4199 bytes .../__pycache__/_bootlocale.cpython-36.pyc | Bin 0 -> 1019 bytes .../_collections_abc.cpython-36.pyc | Bin 0 -> 28882 bytes .../__pycache__/_weakrefset.cpython-36.pyc | Bin 0 -> 7867 bytes .../python3.6/__pycache__/abc.cpython-36.pyc | Bin 0 -> 7527 bytes .../__pycache__/base64.cpython-36.pyc | Bin 0 -> 17167 bytes .../__pycache__/bisect.cpython-36.pyc | Bin 0 -> 2708 bytes .../__pycache__/codecs.cpython-36.pyc | Bin 0 -> 33957 bytes .../python3.6/__pycache__/copy.cpython-36.pyc | Bin 0 -> 7111 bytes .../__pycache__/copyreg.cpython-36.pyc | Bin 0 -> 4223 bytes .../python3.6/__pycache__/enum.cpython-36.pyc | Bin 0 -> 23439 bytes .../__pycache__/fnmatch.cpython-36.pyc | Bin 0 -> 2906 bytes .../__pycache__/functools.cpython-36.pyc | Bin 0 -> 23959 bytes .../__pycache__/genericpath.cpython-36.pyc | Bin 0 -> 3765 bytes .../__pycache__/hashlib.cpython-36.pyc | Bin 0 -> 6668 bytes .../__pycache__/heapq.cpython-36.pyc | Bin 0 -> 14324 bytes .../python3.6/__pycache__/hmac.cpython-36.pyc | Bin 0 -> 4868 bytes .../python3.6/__pycache__/imp.cpython-36.pyc | Bin 0 -> 9711 bytes .../python3.6/__pycache__/io.cpython-36.pyc | Bin 0 -> 3426 bytes .../__pycache__/keyword.cpython-36.pyc | Bin 0 -> 1797 bytes .../__pycache__/linecache.cpython-36.pyc | Bin 0 -> 3810 bytes .../__pycache__/locale.cpython-36.pyc | Bin 0 -> 33047 bytes .../__pycache__/operator.cpython-36.pyc | Bin 0 -> 13945 bytes .../python3.6/__pycache__/os.cpython-36.pyc | Bin 0 -> 29646 bytes .../__pycache__/posixpath.cpython-36.pyc | Bin 0 -> 10428 bytes .../__pycache__/random.cpython-36.pyc | Bin 0 -> 19224 bytes .../python3.6/__pycache__/re.cpython-36.pyc | Bin 0 -> 14090 bytes .../__pycache__/reprlib.cpython-36.pyc | Bin 0 -> 5432 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 30417 bytes .../python3.6/__pycache__/site.cpython-36.pyc | Bin 0 -> 20709 bytes .../__pycache__/sre_compile.cpython-36.pyc | Bin 0 -> 10310 bytes .../__pycache__/sre_constants.cpython-36.pyc | Bin 0 -> 6004 bytes .../__pycache__/sre_parse.cpython-36.pyc | Bin 0 -> 20390 bytes .../python3.6/__pycache__/stat.cpython-36.pyc | Bin 0 -> 3890 bytes .../__pycache__/struct.cpython-36.pyc | Bin 0 -> 344 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 62617 bytes .../__pycache__/tempfile.cpython-36.pyc | Bin 0 -> 22163 bytes .../__pycache__/token.cpython-36.pyc | Bin 0 -> 3352 bytes .../__pycache__/tokenize.cpython-36.pyc | Bin 0 -> 18575 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 8233 bytes .../__pycache__/warnings.cpython-36.pyc | Bin 0 -> 13290 bytes .../__pycache__/weakref.cpython-36.pyc | Bin 0 -> 19175 bytes venv/lib/python3.6/distutils/__init__.py | 101 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2841 bytes venv/lib/python3.6/distutils/distutils.cfg | 6 + .../lib/python3.6/no-global-site-packages.txt | 0 venv/lib/python3.6/orig-prefix.txt | 1 + .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 327 bytes .../python3.6/site-packages/easy_install.py | 5 + .../pip-9.0.1.dist-info/DESCRIPTION.rst | 39 + .../pip-9.0.1.dist-info/INSTALLER | 1 + .../pip-9.0.1.dist-info/METADATA | 69 + .../site-packages/pip-9.0.1.dist-info/RECORD | 501 ++ .../site-packages/pip-9.0.1.dist-info/WHEEL | 6 + .../pip-9.0.1.dist-info/entry_points.txt | 5 + .../pip-9.0.1.dist-info/metadata.json | 1 + .../pip-9.0.1.dist-info/top_level.txt | 1 + .../python3.6/site-packages/pip/__init__.py | 331 + .../python3.6/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 8427 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 426 bytes .../__pycache__/basecommand.cpython-36.pyc | Bin 0 -> 7262 bytes .../pip/__pycache__/baseparser.cpython-36.pyc | Bin 0 -> 9323 bytes .../pip/__pycache__/cmdoptions.cpython-36.pyc | Bin 0 -> 12981 bytes .../pip/__pycache__/download.cpython-36.pyc | Bin 0 -> 20362 bytes .../pip/__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10535 bytes .../pip/__pycache__/index.cpython-36.pyc | Bin 0 -> 30285 bytes .../pip/__pycache__/locations.cpython-36.pyc | Bin 0 -> 3921 bytes .../pip/__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7516 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 390 bytes .../pip/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 21707 bytes .../site-packages/pip/_vendor/__init__.py | 107 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2793 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 18612 bytes .../_vendor/__pycache__/distro.cpython-36.pyc | Bin 0 -> 32584 bytes .../__pycache__/ipaddress.cpython-36.pyc | Bin 0 -> 66419 bytes .../__pycache__/ordereddict.cpython-36.pyc | Bin 0 -> 3617 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201108 bytes .../__pycache__/re-vendor.cpython-36.pyc | Bin 0 -> 1105 bytes .../__pycache__/retrying.cpython-36.pyc | Bin 0 -> 8094 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24483 bytes .../site-packages/pip/_vendor/appdirs.py | 552 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 552 bytes .../__pycache__/_cmd.cpython-36.pyc | Bin 0 -> 1561 bytes .../__pycache__/adapter.cpython-36.pyc | Bin 0 -> 2888 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 1763 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 619 bytes .../__pycache__/controller.cpython-36.pyc | Bin 0 -> 7763 bytes .../__pycache__/filewrapper.cpython-36.pyc | Bin 0 -> 2156 bytes .../__pycache__/heuristics.cpython-36.pyc | Bin 0 -> 4698 bytes .../__pycache__/serialize.cpython-36.pyc | Bin 0 -> 4475 bytes .../__pycache__/wrapper.cpython-36.pyc | Bin 0 -> 571 bytes .../pip/_vendor/cachecontrol/_cmd.py | 60 + .../pip/_vendor/cachecontrol/adapter.py | 125 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 18 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 609 bytes .../__pycache__/file_cache.cpython-36.pyc | Bin 0 -> 2806 bytes .../__pycache__/redis_cache.cpython-36.pyc | Bin 0 -> 1712 bytes .../_vendor/cachecontrol/caches/file_cache.py | 116 + .../cachecontrol/caches/redis_cache.py | 41 + .../pip/_vendor/cachecontrol/compat.py | 20 + .../pip/_vendor/cachecontrol/controller.py | 353 + .../pip/_vendor/cachecontrol/filewrapper.py | 78 + .../pip/_vendor/cachecontrol/heuristics.py | 138 + .../pip/_vendor/cachecontrol/serialize.py | 196 + .../pip/_vendor/cachecontrol/wrapper.py | 21 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 446 bytes .../colorama/__pycache__/ansi.cpython-36.pyc | Bin 0 -> 3344 bytes .../__pycache__/ansitowin32.cpython-36.pyc | Bin 0 -> 7076 bytes .../__pycache__/initialise.cpython-36.pyc | Bin 0 -> 1667 bytes .../colorama/__pycache__/win32.cpython-36.pyc | Bin 0 -> 3637 bytes .../__pycache__/winterm.cpython-36.pyc | Bin 0 -> 4569 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 236 + .../pip/_vendor/colorama/initialise.py | 82 + .../pip/_vendor/colorama/win32.py | 154 + .../pip/_vendor/colorama/winterm.py | 162 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1044 bytes .../distlib/__pycache__/compat.cpython-36.pyc | Bin 0 -> 32005 bytes .../__pycache__/database.cpython-36.pyc | Bin 0 -> 42143 bytes .../distlib/__pycache__/index.cpython-36.pyc | Bin 0 -> 17377 bytes .../__pycache__/locators.cpython-36.pyc | Bin 0 -> 38601 bytes .../__pycache__/manifest.cpython-36.pyc | Bin 0 -> 10363 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 6039 bytes .../__pycache__/metadata.cpython-36.pyc | Bin 0 -> 27082 bytes .../__pycache__/resources.cpython-36.pyc | Bin 0 -> 10911 bytes .../__pycache__/scripts.cpython-36.pyc | Bin 0 -> 10078 bytes .../distlib/__pycache__/util.cpython-36.pyc | Bin 0 -> 44505 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 21021 bytes .../distlib/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 25042 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 486 bytes .../_backport/__pycache__/misc.cpython-36.pyc | Bin 0 -> 1092 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 21439 bytes .../__pycache__/sysconfig.cpython-36.pyc | Bin 0 -> 16040 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 63050 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 | 1111 ++++ .../pip/_vendor/distlib/database.py | 1312 ++++ .../pip/_vendor/distlib/index.py | 515 ++ .../pip/_vendor/distlib/locators.py | 1283 ++++ .../pip/_vendor/distlib/manifest.py | 393 ++ .../pip/_vendor/distlib/markers.py | 190 + .../pip/_vendor/distlib/metadata.py | 1068 ++++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 384 ++ .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 97792 bytes .../site-packages/pip/_vendor/distlib/util.py | 1611 +++++ .../pip/_vendor/distlib/version.py | 742 +++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 85504 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 94208 bytes .../pip/_vendor/distlib/wheel.py | 978 +++ .../site-packages/pip/_vendor/distro.py | 1081 ++++ .../pip/_vendor/html5lib/__init__.py | 25 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 965 bytes .../__pycache__/_ihatexml.cpython-36.pyc | Bin 0 -> 13859 bytes .../__pycache__/_inputstream.cpython-36.pyc | Bin 0 -> 22713 bytes .../__pycache__/_tokenizer.cpython-36.pyc | Bin 0 -> 42163 bytes .../__pycache__/_utils.cpython-36.pyc | Bin 0 -> 3372 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 66322 bytes .../__pycache__/html5parser.cpython-36.pyc | Bin 0 -> 98007 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 9368 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-36.pyc | Bin 0 -> 428 bytes .../_trie/__pycache__/_base.cpython-36.pyc | Bin 0 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-36.pyc | Bin 0 -> 2030 bytes .../_trie/__pycache__/py.cpython-36.pyc | Bin 0 -> 2235 bytes .../pip/_vendor/html5lib/_trie/_base.py | 38 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 127 + .../pip/_vendor/html5lib/constants.py | 2945 +++++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 203 bytes .../alphabeticalattributes.cpython-36.pyc | Bin 0 -> 1074 bytes .../filters/__pycache__/base.cpython-36.pyc | Bin 0 -> 853 bytes .../inject_meta_charset.cpython-36.pyc | Bin 0 -> 1704 bytes .../filters/__pycache__/lint.cpython-36.pyc | Bin 0 -> 2375 bytes .../__pycache__/optionaltags.cpython-36.pyc | Bin 0 -> 3047 bytes .../__pycache__/sanitizer.cpython-36.pyc | Bin 0 -> 18042 bytes .../__pycache__/whitespace.cpython-36.pyc | Bin 0 -> 1279 bytes .../filters/alphabeticalattributes.py | 20 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 65 + .../pip/_vendor/html5lib/filters/lint.py | 81 + .../_vendor/html5lib/filters/optionaltags.py | 206 + .../pip/_vendor/html5lib/filters/sanitizer.py | 865 +++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2733 ++++++++ .../pip/_vendor/html5lib/serializer.py | 334 + .../_vendor/html5lib/treeadapters/__init__.py | 12 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 458 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1535 bytes .../__pycache__/sax.cpython-36.pyc | Bin 0 -> 1389 bytes .../_vendor/html5lib/treeadapters/genshi.py | 47 + .../pip/_vendor/html5lib/treeadapters/sax.py | 44 + .../_vendor/html5lib/treebuilders/__init__.py | 76 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3137 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 11180 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 9276 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 11870 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 11822 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 383 ++ .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 367 ++ .../_vendor/html5lib/treewalkers/__init__.py | 143 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3828 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 4584 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 1725 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 3679 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 6660 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1899 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 150 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 137 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../site-packages/pip/_vendor/ipaddress.py | 2425 +++++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 9912 bytes .../__pycache__/linklockfile.cpython-36.pyc | Bin 0 -> 2291 bytes .../__pycache__/mkdirlockfile.cpython-36.pyc | Bin 0 -> 2653 bytes .../__pycache__/pidlockfile.cpython-36.pyc | Bin 0 -> 4853 bytes .../__pycache__/sqlitelockfile.cpython-36.pyc | Bin 0 -> 3752 bytes .../symlinklockfile.cpython-36.pyc | Bin 0 -> 2176 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 + .../site-packages/pip/_vendor/ordereddict.py | 127 + .../pip/_vendor/packaging/__about__.py | 21 + .../pip/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 722 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 560 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1007 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2864 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8878 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3865 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19826 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 491 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10601 bytes .../pip/_vendor/packaging/_compat.py | 30 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 303 + .../pip/_vendor/packaging/requirements.py | 129 + .../pip/_vendor/packaging/specifiers.py | 774 +++ .../pip/_vendor/packaging/utils.py | 14 + .../pip/_vendor/packaging/version.py | 393 ++ .../pip/_vendor/pkg_resources/__init__.py | 3052 +++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 95310 bytes .../pip/_vendor/progress/__init__.py | 123 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3848 bytes .../progress/__pycache__/bar.cpython-36.pyc | Bin 0 -> 2467 bytes .../__pycache__/counter.cpython-36.pyc | Bin 0 -> 1591 bytes .../__pycache__/helpers.cpython-36.pyc | Bin 0 -> 2977 bytes .../__pycache__/spinner.cpython-36.pyc | Bin 0 -> 1233 bytes .../site-packages/pip/_vendor/progress/bar.py | 83 + .../pip/_vendor/progress/counter.py | 47 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 40 + .../site-packages/pip/_vendor/pyparsing.py | 5696 +++++++++++++++++ .../site-packages/pip/_vendor/re-vendor.py | 34 + .../pip/_vendor/requests/__init__.py | 88 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2340 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 15810 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 6041 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 7155 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 827 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1413 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18479 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 4883 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 1000 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 21914 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 17972 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 3661 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4408 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 18796 bytes .../pip/_vendor/requests/adapters.py | 503 ++ .../site-packages/pip/_vendor/requests/api.py | 148 + .../pip/_vendor/requests/auth.py | 252 + .../pip/_vendor/requests/cacert.pem | 5616 ++++++++++++++++ .../pip/_vendor/requests/certs.py | 25 + .../pip/_vendor/requests/compat.py | 68 + .../pip/_vendor/requests/cookies.py | 540 ++ .../pip/_vendor/requests/exceptions.py | 114 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 873 +++ .../pip/_vendor/requests/packages/__init__.py | 36 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1606 bytes .../requests/packages/chardet/__init__.py | 32 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 699 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 141793 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 961 bytes .../__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 2573 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6183 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 2027 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 1778 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 1498 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 507 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 362 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 968 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 1948 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 6918 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2259 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 88833 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 969 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 61231 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 969 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 68849 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 975 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2763 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 84065 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38570 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24852 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30382 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24539 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23397 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24837 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23383 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2795 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 1986 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1072 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 16615 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2745 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1636 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2292 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 3272 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1791 bytes .../requests/packages/chardet/big5freq.py | 925 +++ .../requests/packages/chardet/big5prober.py | 42 + .../requests/packages/chardet/chardetect.py | 80 + .../packages/chardet/chardistribution.py | 231 + .../packages/chardet/charsetgroupprober.py | 106 + .../packages/chardet/charsetprober.py | 62 + .../packages/chardet/codingstatemachine.py | 61 + .../requests/packages/chardet/compat.py | 34 + .../requests/packages/chardet/constants.py | 39 + .../requests/packages/chardet/cp949prober.py | 44 + .../requests/packages/chardet/escprober.py | 86 + .../requests/packages/chardet/escsm.py | 242 + .../requests/packages/chardet/eucjpprober.py | 90 + .../requests/packages/chardet/euckrfreq.py | 596 ++ .../requests/packages/chardet/euckrprober.py | 42 + .../requests/packages/chardet/euctwfreq.py | 428 ++ .../requests/packages/chardet/euctwprober.py | 41 + .../requests/packages/chardet/gb2312freq.py | 472 ++ .../requests/packages/chardet/gb2312prober.py | 41 + .../requests/packages/chardet/hebrewprober.py | 283 + .../requests/packages/chardet/jisfreq.py | 569 ++ .../requests/packages/chardet/jpcntx.py | 227 + .../packages/chardet/langbulgarianmodel.py | 229 + .../packages/chardet/langcyrillicmodel.py | 329 + .../packages/chardet/langgreekmodel.py | 225 + .../packages/chardet/langhebrewmodel.py | 201 + .../packages/chardet/langhungarianmodel.py | 225 + .../packages/chardet/langthaimodel.py | 200 + .../requests/packages/chardet/latin1prober.py | 139 + .../packages/chardet/mbcharsetprober.py | 86 + .../packages/chardet/mbcsgroupprober.py | 54 + .../requests/packages/chardet/mbcssm.py | 572 ++ .../packages/chardet/sbcharsetprober.py | 120 + .../packages/chardet/sbcsgroupprober.py | 69 + .../requests/packages/chardet/sjisprober.py | 91 + .../packages/chardet/universaldetector.py | 170 + .../requests/packages/chardet/utf8prober.py | 76 + .../requests/packages/urllib3/__init__.py | 96 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2529 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10612 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 8471 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 22755 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 8928 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5886 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2689 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 10875 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5631 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 13808 bytes .../requests/packages/urllib3/_collections.py | 324 + .../requests/packages/urllib3/connection.py | 330 + .../packages/urllib3/connectionpool.py | 866 +++ .../packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 220 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 6688 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3317 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 10161 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 4535 bytes .../packages/urllib3/contrib/appengine.py | 231 + .../packages/urllib3/contrib/ntlmpool.py | 115 + .../packages/urllib3/contrib/pyopenssl.py | 358 ++ .../packages/urllib3/contrib/socks.py | 172 + .../requests/packages/urllib3/exceptions.py | 209 + .../requests/packages/urllib3/fields.py | 178 + .../requests/packages/urllib3/filepost.py | 94 + .../packages/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 346 bytes .../__pycache__/ordered_dict.cpython-36.pyc | Bin 0 -> 8423 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 24518 bytes .../packages/urllib3/packages/ordered_dict.py | 259 + .../requests/packages/urllib3/packages/six.py | 868 +++ .../packages/ssl_match_hostname/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 507 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 2331 bytes .../ssl_match_hostname/_implementation.py | 105 + .../requests/packages/urllib3/poolmanager.py | 367 ++ .../requests/packages/urllib3/request.py | 151 + .../requests/packages/urllib3/response.py | 530 ++ .../packages/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1018 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3304 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 2003 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1875 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 9159 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 8784 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8790 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 4939 bytes .../packages/urllib3/util/connection.py | 144 + .../requests/packages/urllib3/util/request.py | 72 + .../packages/urllib3/util/response.py | 74 + .../requests/packages/urllib3/util/retry.py | 300 + .../requests/packages/urllib3/util/ssl_.py | 320 + .../requests/packages/urllib3/util/timeout.py | 242 + .../requests/packages/urllib3/util/url.py | 217 + .../pip/_vendor/requests/sessions.py | 712 +++ .../pip/_vendor/requests/status_codes.py | 91 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 817 +++ .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 868 +++ .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 9678 bytes .../__pycache__/labels.cpython-36.pyc | Bin 0 -> 4092 bytes .../__pycache__/mklabels.cpython-36.pyc | Bin 0 -> 1914 bytes .../__pycache__/tests.cpython-36.pyc | Bin 0 -> 5070 bytes .../__pycache__/x_user_defined.cpython-36.pyc | Bin 0 -> 2667 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/pip/basecommand.py | 337 + .../python3.6/site-packages/pip/baseparser.py | 293 + .../python3.6/site-packages/pip/cmdoptions.py | 633 ++ .../site-packages/pip/commands/__init__.py | 86 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2080 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 0 -> 1321 bytes .../__pycache__/completion.cpython-36.pyc | Bin 0 -> 2652 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 5437 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2634 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 0 -> 1975 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 0 -> 1126 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 9908 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 0 -> 9737 bytes .../__pycache__/search.cpython-36.pyc | Bin 0 -> 4216 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 0 -> 5387 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 0 -> 2612 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5474 bytes .../site-packages/pip/commands/check.py | 39 + .../site-packages/pip/commands/completion.py | 81 + .../site-packages/pip/commands/download.py | 212 + .../site-packages/pip/commands/freeze.py | 87 + .../site-packages/pip/commands/hash.py | 57 + .../site-packages/pip/commands/help.py | 35 + .../site-packages/pip/commands/install.py | 437 ++ .../site-packages/pip/commands/list.py | 337 + .../site-packages/pip/commands/search.py | 133 + .../site-packages/pip/commands/show.py | 154 + .../site-packages/pip/commands/uninstall.py | 76 + .../site-packages/pip/commands/wheel.py | 208 + .../site-packages/pip/compat/__init__.py | 164 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 4009 bytes .../__pycache__/dictconfig.cpython-36.pyc | Bin 0 -> 13656 bytes .../site-packages/pip/compat/dictconfig.py | 565 ++ .../python3.6/site-packages/pip/download.py | 906 +++ .../python3.6/site-packages/pip/exceptions.py | 244 + venv/lib/python3.6/site-packages/pip/index.py | 1102 ++++ .../python3.6/site-packages/pip/locations.py | 182 + .../site-packages/pip/models/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 275 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 0 -> 879 bytes .../site-packages/pip/models/index.py | 16 + .../site-packages/pip/operations/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 189 bytes .../__pycache__/check.cpython-36.pyc | Bin 0 -> 1476 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2933 bytes .../site-packages/pip/operations/check.py | 49 + .../site-packages/pip/operations/freeze.py | 132 + .../python3.6/site-packages/pip/pep425tags.py | 324 + .../site-packages/pip/req/__init__.py | 10 + .../req/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 456 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 0 -> 8471 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 0 -> 30172 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 0 -> 21019 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 0 -> 6334 bytes .../site-packages/pip/req/req_file.py | 342 + .../site-packages/pip/req/req_install.py | 1204 ++++ .../site-packages/pip/req/req_set.py | 798 +++ .../site-packages/pip/req/req_uninstall.py | 195 + .../site-packages/pip/status_codes.py | 8 + .../site-packages/pip/utils/__init__.py | 852 +++ .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 22250 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 7753 bytes .../utils/__pycache__/build.cpython-36.pyc | Bin 0 -> 1367 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 0 -> 1780 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1070 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 635 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1418 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 0 -> 3294 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 3950 bytes .../utils/__pycache__/outdated.cpython-36.pyc | Bin 0 -> 4275 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 0 -> 2038 bytes .../setuptools_build.cpython-36.pyc | Bin 0 -> 379 bytes .../pip/utils/__pycache__/ui.cpython-36.pyc | Bin 0 -> 9635 bytes .../site-packages/pip/utils/appdirs.py | 248 + .../site-packages/pip/utils/build.py | 42 + .../site-packages/pip/utils/deprecation.py | 76 + .../site-packages/pip/utils/encoding.py | 31 + .../site-packages/pip/utils/filesystem.py | 28 + .../site-packages/pip/utils/glibc.py | 81 + .../site-packages/pip/utils/hashes.py | 92 + .../site-packages/pip/utils/logging.py | 130 + .../site-packages/pip/utils/outdated.py | 162 + .../site-packages/pip/utils/packaging.py | 63 + .../pip/utils/setuptools_build.py | 8 + .../python3.6/site-packages/pip/utils/ui.py | 344 + .../site-packages/pip/vcs/__init__.py | 366 ++ .../vcs/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11154 bytes .../pip/vcs/__pycache__/bazaar.cpython-36.pyc | Bin 0 -> 3707 bytes .../pip/vcs/__pycache__/git.cpython-36.pyc | Bin 0 -> 8847 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 0 -> 3620 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 0 -> 7159 bytes .../python3.6/site-packages/pip/vcs/bazaar.py | 116 + .../python3.6/site-packages/pip/vcs/git.py | 300 + .../site-packages/pip/vcs/mercurial.py | 103 + .../site-packages/pip/vcs/subversion.py | 269 + venv/lib/python3.6/site-packages/pip/wheel.py | 853 +++ .../site-packages/pkg_resources/__init__.py | 3172 +++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 98566 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 706 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 203 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 18629 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201125 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24500 bytes .../pkg_resources/_vendor/appdirs.py | 552 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 739 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 577 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1024 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2881 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8904 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19843 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 508 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10618 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 | 5696 +++++++++++++++++ .../pkg_resources/_vendor/six.py | 868 +++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2434 bytes .../site-packages/pkg_resources/py31compat.py | 22 + .../DESCRIPTION.rst | 36 + .../setuptools-36.5.0.dist-info/INSTALLER | 1 + .../setuptools-36.5.0.dist-info/METADATA | 69 + .../setuptools-36.5.0.dist-info/RECORD | 155 + .../setuptools-36.5.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 64 + .../setuptools-36.5.0.dist-info/metadata.json | 1 + .../setuptools-36.5.0.dist-info/top_level.txt | 3 + .../setuptools-36.5.0.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 160 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 5683 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 0 -> 5168 bytes .../__pycache__/config.cpython-36.pyc | Bin 0 -> 14351 bytes .../__pycache__/dep_util.cpython-36.pyc | Bin 0 -> 865 bytes .../__pycache__/depends.cpython-36.pyc | Bin 0 -> 5291 bytes .../__pycache__/dist.cpython-36.pyc | Bin 0 -> 35592 bytes .../__pycache__/extension.cpython-36.pyc | Bin 0 -> 1985 bytes .../__pycache__/glob.cpython-36.pyc | Bin 0 -> 3853 bytes .../__pycache__/launch.cpython-36.pyc | Bin 0 -> 864 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 0 -> 2443 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 0 -> 5191 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 0 -> 34553 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 0 -> 3688 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 0 -> 32484 bytes .../__pycache__/py26compat.cpython-36.pyc | Bin 0 -> 1073 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 0 -> 821 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 1903 bytes .../__pycache__/py33compat.cpython-36.pyc | Bin 0 -> 1238 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 2217 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 15920 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 0 -> 1516 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 6685 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 0 -> 1179 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 338 bytes .../windows_support.cpython-36.pyc | Bin 0 -> 1021 bytes .../site-packages/setuptools/archive_util.py | 173 + .../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 | 17 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 736 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 0 -> 2444 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 0 -> 13953 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 0 -> 1787 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 0 -> 988 bytes .../__pycache__/build_clib.cpython-36.pyc | Bin 0 -> 2459 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 0 -> 10014 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 0 -> 8583 bytes .../__pycache__/develop.cpython-36.pyc | Bin 0 -> 6435 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 64298 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 0 -> 21073 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 3984 bytes .../install_egg_info.cpython-36.pyc | Bin 0 -> 2449 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 0 -> 4094 bytes .../install_scripts.cpython-36.pyc | Bin 0 -> 2289 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 4634 bytes .../__pycache__/register.cpython-36.pyc | Bin 0 -> 604 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 0 -> 2590 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 0 -> 935 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 0 -> 6426 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 0 -> 4613 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 0 -> 8012 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 0 -> 1402 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 0 -> 6111 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 480 ++ .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 214 + .../setuptools/command/easy_install.py | 2301 +++++++ .../setuptools/command/egg_info.py | 701 ++ .../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 | 10 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 207 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 258 + .../setuptools/command/upload.py | 42 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 554 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1012 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 343 bytes .../site-packages/setuptools/glob.py | 176 + .../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 | 197 + .../site-packages/setuptools/msvc.py | 1302 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1115 ++++ .../site-packages/setuptools/py26compat.py | 31 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 56 + .../site-packages/setuptools/py33compat.py | 45 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 495 ++ .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 255 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../setuptools/windows_support.py | 29 + .../wheel-0.30.0.dist-info/DESCRIPTION.rst | 340 + .../wheel-0.30.0.dist-info/INSTALLER | 1 + .../wheel-0.30.0.dist-info/LICENSE.txt | 22 + .../wheel-0.30.0.dist-info/METADATA | 374 ++ .../wheel-0.30.0.dist-info/RECORD | 46 + .../wheel-0.30.0.dist-info/WHEEL | 6 + .../wheel-0.30.0.dist-info/entry_points.txt | 6 + .../wheel-0.30.0.dist-info/metadata.json | 1 + .../wheel-0.30.0.dist-info/top_level.txt | 1 + .../python3.6/site-packages/wheel/__init__.py | 2 + .../python3.6/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 204 bytes .../wheel/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 599 bytes .../wheel/__pycache__/archive.cpython-36.pyc | Bin 0 -> 2067 bytes .../__pycache__/bdist_wheel.cpython-36.pyc | Bin 0 -> 13206 bytes .../__pycache__/decorator.cpython-36.pyc | Bin 0 -> 886 bytes .../__pycache__/egg2wheel.cpython-36.pyc | Bin 0 -> 2583 bytes .../wheel/__pycache__/install.cpython-36.pyc | Bin 0 -> 14340 bytes .../wheel/__pycache__/metadata.cpython-36.pyc | Bin 0 -> 8651 bytes .../wheel/__pycache__/paths.cpython-36.pyc | Bin 0 -> 1126 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 4636 bytes .../wheel/__pycache__/pkginfo.cpython-36.pyc | Bin 0 -> 1575 bytes .../wheel/__pycache__/util.cpython-36.pyc | Bin 0 -> 5642 bytes .../__pycache__/wininst2wheel.cpython-36.pyc | Bin 0 -> 5377 bytes .../python3.6/site-packages/wheel/archive.py | 80 + .../site-packages/wheel/bdist_wheel.py | 482 ++ .../site-packages/wheel/decorator.py | 19 + .../site-packages/wheel/egg2wheel.py | 90 + .../python3.6/site-packages/wheel/install.py | 494 ++ .../python3.6/site-packages/wheel/metadata.py | 338 + .../python3.6/site-packages/wheel/paths.py | 43 + .../site-packages/wheel/pep425tags.py | 180 + .../python3.6/site-packages/wheel/pkginfo.py | 43 + .../wheel/signatures/__init__.py | 110 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2923 bytes .../__pycache__/djbec.cpython-36.pyc | Bin 0 -> 9323 bytes .../__pycache__/ed25519py.cpython-36.pyc | Bin 0 -> 1718 bytes .../__pycache__/keys.cpython-36.pyc | Bin 0 -> 4069 bytes .../site-packages/wheel/signatures/djbec.py | 323 + .../wheel/signatures/ed25519py.py | 50 + .../site-packages/wheel/signatures/keys.py | 101 + .../site-packages/wheel/tool/__init__.py | 376 ++ .../tool/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11385 bytes .../lib/python3.6/site-packages/wheel/util.py | 176 + .../site-packages/wheel/wininst2wheel.py | 217 + venv/lib/python3.6/site.py | 758 +++ venv/pip-selfcheck.json | 1 + 757 files changed, 116236 insertions(+) create mode 100644 venv/bin/activate create mode 100644 venv/bin/activate.csh create mode 100644 venv/bin/activate.fish create mode 100644 venv/bin/activate_this.py create mode 100755 venv/bin/easy_install create mode 100755 venv/bin/easy_install-3.6 create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip3 create mode 100755 venv/bin/pip3.6 create mode 100755 venv/bin/python-config create mode 100755 venv/bin/python3.6 create mode 100755 venv/bin/wheel create mode 100644 venv/lib/python3.6/__pycache__/__future__.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/abc.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/base64.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/bisect.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/codecs.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/copy.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/copyreg.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/enum.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/functools.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/genericpath.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/hashlib.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/heapq.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/hmac.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/imp.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/io.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/keyword.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/linecache.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/locale.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/operator.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/os.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/posixpath.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/random.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/re.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/reprlib.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/shutil.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/site.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/stat.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/struct.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/tarfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/tempfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/token.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/tokenize.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/warnings.cpython-36.pyc create mode 100644 venv/lib/python3.6/__pycache__/weakref.cpython-36.pyc create mode 100644 venv/lib/python3.6/distutils/__init__.py create mode 100644 venv/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/distutils/distutils.cfg create mode 100644 venv/lib/python3.6/no-global-site-packages.txt create mode 100644 venv/lib/python3.6/orig-prefix.txt create mode 100644 venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/easy_install.py create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pip/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/__main__.py create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/basecommand.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/baseparser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/status_codes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ordereddict.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/appdirs.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/distro.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/ipaddress.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/ordereddict.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/bar.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/counter.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/helpers.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/pyparsing.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/re-vendor.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/cacert.pem create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/big5freq.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/big5prober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/chardetect.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/chardistribution.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/compat.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/constants.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/cp949prober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/escprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/escsm.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euckrprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euctwfreq.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euctwprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/gb2312freq.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/gb2312prober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/hebrewprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/jisfreq.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/jpcntx.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langbulgarianmodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langcyrillicmodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langgreekmodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langhebrewmodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langhungarianmodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langthaimodel.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/latin1prober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcsgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sbcsgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/utf8prober.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/_collections.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/connection.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/connectionpool.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/appengine.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/fields.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/filepost.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/request.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/response.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/request.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/response.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/retry.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/url.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/retrying.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/six.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/lib/python3.6/site-packages/pip/basecommand.py create mode 100644 venv/lib/python3.6/site-packages/pip/baseparser.py create mode 100644 venv/lib/python3.6/site-packages/pip/cmdoptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/check.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/completion.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/download.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/freeze.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/hash.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/help.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/list.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/search.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/show.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/uninstall.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/check.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/completion.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/download.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/freeze.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/hash.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/help.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/install.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/list.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/search.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/show.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/uninstall.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/wheel.py create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__pycache__/dictconfig.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/compat/dictconfig.py create mode 100644 venv/lib/python3.6/site-packages/pip/download.py create mode 100644 venv/lib/python3.6/site-packages/pip/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/index.py create mode 100644 venv/lib/python3.6/site-packages/pip/locations.py create mode 100644 venv/lib/python3.6/site-packages/pip/models/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/models/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/models/__pycache__/index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/models/index.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/check.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/freeze.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/check.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/freeze.py create mode 100644 venv/lib/python3.6/site-packages/pip/pep425tags.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_file.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_set.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_uninstall.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_file.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_install.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_set.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_uninstall.py create mode 100644 venv/lib/python3.6/site-packages/pip/status_codes.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/appdirs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/build.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/deprecation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/encoding.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/filesystem.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/glibc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/hashes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/logging.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/outdated.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/packaging.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/setuptools_build.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/ui.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/appdirs.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/build.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/deprecation.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/encoding.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/filesystem.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/glibc.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/hashes.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/logging.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/outdated.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/packaging.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/setuptools_build.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/ui.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/bazaar.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/git.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/mercurial.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/subversion.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/bazaar.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/git.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/mercurial.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/subversion.py create mode 100644 venv/lib/python3.6/site-packages/pip/wheel.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/six.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/py31compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/dependency_links.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-36.5.0.dist-info/zip-safe create mode 100644 venv/lib/python3.6/site-packages/setuptools/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py26compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py36compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/archive_util.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli-32.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli-64.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/alias.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_clib.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_ext.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_py.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/develop.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/easy_install.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/egg_info.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_lib.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/py36compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/register.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/rotate.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/saveopts.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/sdist.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/setopt.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/test.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/upload.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/config.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/dep_util.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/depends.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/dist.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extension.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extern/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/glob.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui-32.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui-64.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/launch.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/lib2to3_ex.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/monkey.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/msvc.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/namespaces.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/package_index.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py26compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py27compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py31compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py33compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py36compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/sandbox.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/lib/python3.6/site-packages/setuptools/script.tmpl create mode 100644 venv/lib/python3.6/site-packages/setuptools/site-patch.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/ssl_support.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/unicode_utils.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/version.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/windows_support.py create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/wheel-0.30.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/wheel/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wheel/__main__.py create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/__main__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/archive.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/decorator.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/egg2wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/metadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/paths.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/pep425tags.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/pkginfo.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/__pycache__/wininst2wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/archive.py create mode 100644 venv/lib/python3.6/site-packages/wheel/bdist_wheel.py create mode 100644 venv/lib/python3.6/site-packages/wheel/decorator.py create mode 100644 venv/lib/python3.6/site-packages/wheel/egg2wheel.py create mode 100644 venv/lib/python3.6/site-packages/wheel/install.py create mode 100644 venv/lib/python3.6/site-packages/wheel/metadata.py create mode 100644 venv/lib/python3.6/site-packages/wheel/paths.py create mode 100644 venv/lib/python3.6/site-packages/wheel/pep425tags.py create mode 100644 venv/lib/python3.6/site-packages/wheel/pkginfo.py create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/__pycache__/djbec.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/__pycache__/ed25519py.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/__pycache__/keys.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/djbec.py create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/ed25519py.py create mode 100644 venv/lib/python3.6/site-packages/wheel/signatures/keys.py create mode 100644 venv/lib/python3.6/site-packages/wheel/tool/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wheel/tool/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wheel/util.py create mode 100644 venv/lib/python3.6/site-packages/wheel/wininst2wheel.py create mode 100644 venv/lib/python3.6/site.py create mode 100644 venv/pip-selfcheck.json diff --git a/venv/bin/activate b/venv/bin/activate new file mode 100644 index 0000000..e06245c --- /dev/null +++ b/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/amdavidson/dev/photoflow/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/venv/bin/activate.csh b/venv/bin/activate.csh new file mode 100644 index 0000000..fbcd79d --- /dev/null +++ b/venv/bin/activate.csh @@ -0,0 +1,36 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/amdavidson/dev/photoflow/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + + +if ("" != "") then + set env_name = "" +else + set env_name = `basename "$VIRTUAL_ENV"` +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" + set prompt = "[$env_name] $prompt" +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash + diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish new file mode 100644 index 0000000..374a581 --- /dev/null +++ b/venv/bin/activate.fish @@ -0,0 +1,76 @@ +# This file must be used using `. 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/amdavidson/dev/photoflow/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/venv/bin/activate_this.py b/venv/bin/activate_this.py new file mode 100644 index 0000000..f18193b --- /dev/null +++ b/venv/bin/activate_this.py @@ -0,0 +1,34 @@ +"""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 sys +import os + +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) +import site +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/venv/bin/easy_install b/venv/bin/easy_install new file mode 100755 index 0000000..0a84fe0 --- /dev/null +++ b/venv/bin/easy_install @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- 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/venv/bin/easy_install-3.6 b/venv/bin/easy_install-3.6 new file mode 100755 index 0000000..0a84fe0 --- /dev/null +++ b/venv/bin/easy_install-3.6 @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- 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/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..bc1e218 --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 new file mode 100755 index 0000000..bc1e218 --- /dev/null +++ b/venv/bin/pip3 @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3.6 b/venv/bin/pip3.6 new file mode 100755 index 0000000..bc1e218 --- /dev/null +++ b/venv/bin/pip3.6 @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/python-config b/venv/bin/python-config new file mode 100755 index 0000000..f928783 --- /dev/null +++ b/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/amdavidson/dev/photoflow/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/venv/bin/python3.6 b/venv/bin/python3.6 new file mode 100755 index 0000000000000000000000000000000000000000..5e1cec499adb514d022a51e14feebe2fd4334193 GIT binary patch literal 13068 zcmeHOZ)_Ar6rVzi2UZLIiANMz(PA~`maA>86_Z=&)xB`lN()q=jC*%m?)2{VvbUFV z2{t69(e=`VPv}RD@e7GY5)ufSrlu%O{9rZ4U=XSym_`0bf&pU!=Xfd7EhshAy#{)=ROfqs6-)-IMp#lp z5LZYo+3&@a=8ZxuKO3sfcVe}jugz)UV)p}|lW&O=u=CNRn$D>@#H#aMbMn3Ev`37* z&&s^<#q)-q%IwrG@NJDx09G?4ZVQ<$4@<^5L4JAg<0~ z*VrYlYddgFX{XdDd1?fETx7Wu1I)z1xUR70m|~pLJ(_1(@0ibrjZuWTZxJH@OVM$J z(rlXMic0QLk#NK>3-+EA2kT?5x z6^*>IIoug>e-rENJoWC!fKgnGd7Q1y;%nh|%bGxe-1xvYu^PKr5BNB^7FhVl*3u7F z2oiE1*v@7`roi3{+5?J$`CY}e$GSVoHOTYu0+sheOaR3>i-o){rc*I7QA{TQqdW?V z<5+ZT&H10VcicR3c*Sr1?eE=s5@O3iNj2kKcKI*NhJACke`Of+e9a z{Mk4}#NJ}wP%~mQ71I^HD0b;eMjg`hxANj9O;@|LLN=ioDJ>fqbZf+Is-A~PUX-fZ zK-zizEP;gr4XJz8c)?I&X_e*_BPj*~VxXsJB(*GQ3p9KCwWAC5_gtV&biToU+Ckm< zENcF#7FT7KOW@Ozp0nPwtfHS}u;0$mEI0Kvk&H!hCGjLZ1w#w!OX}h#d+A8(+$|INk5%Vv}yd{sl zR0lUE)-c>jNMqp|IeuFH>ilBaoUwW#6fsYsD>L_-?$L6?fghop?$H|!2fhU-SPtH> z`k+=ePgyN!M<*H%9Dy3y3{T5rt>X|2maQNrh@Xv`nW^yTmEopv@XF@WhRg8rb!fZU zto@UH__+2u7n3PLzPg{>e6(o3rC1{sm_%QcL z2nHuQ%|9%>zp0nPwtfHS}u;0$mEI0Kvk&H!hC zGw?q!uwt$Mb?o-R5XGnK2{@6+k=Jx`FochF+2eQ`gZJX_nEfEO)BO*GXiu?Q&Co5% zP?xT%5Z487u-iWPfN&EF(@u7%5!K>KnzdeUhr5+j7C&wWIG3{5&=Z9m#zS-QUeze% zBs@=13{B5ttqda`%)!feV-R5v!XZ6nupasW!w2o?Sb;9o&uJ*#h%6v#uoc4pD4v3%0bj Jz#Dj!e*t-hNY4NO literal 0 HcmV?d00001 diff --git a/venv/bin/wheel b/venv/bin/wheel new file mode 100755 index 0000000..9c971b5 --- /dev/null +++ b/venv/bin/wheel @@ -0,0 +1,11 @@ +#!/Users/amdavidson/dev/photoflow/venv/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.tool import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/lib/python3.6/__pycache__/__future__.cpython-36.pyc b/venv/lib/python3.6/__pycache__/__future__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8987de7525fd03400c8930e152356f5ca6df6b5f GIT binary patch literal 4199 zcmbtXNpsuC6$TekB&^M{Ju^w1ObAkH9r2{e_(JJuKWLr#us|(EZTM>$iRHH6L$o>TkRMe0{mA zY5&$1o)YM%c>RB&5t^ZijL3?d$cr^m5bL5SO2d+o5&AGAGoNZkR@^XhV#CObO=C@L z83nOztcx9^C~g`hv1{n!mT}`7P23iDzSqQ^_gP~@Zip{LS?1p7j7`w@#FsJ;dJFVd z;+Jv_^fu^Ui9J~Wy#u-;el6EQ-vs>|QI$o|yP)rjnk<371$tjRkUHqwpdX4y@&@QT zf_1gZV?HQoT1Q%*63iR0$%y+>+_zn3yOuYe@WAdnk~!QRPWezWYXnOAHC?ZBYs4Je zmCW{OXE2g%;HmNNb)Dfkl029y+2Ui#{=mv+^1WAP?MYyJE_XW8kvNQ%t7Z0ryMhOv zI$Icw*buAhpF>DzJ5n7ve8|d`vaX+wq>@$ULJ00SXVohweSPJeD#O97?*${qm1MuY zA515X^z}p^pQI#yofI={>vc(Pn& z<-QD}-h!ewY%I&nQ>;9&;eqlK<_F4lhcmHKM%{X+anMW@S(d({>#H7AQTX_A2-wOG zm`Z#L3!IK@YZS-CKzUYp7%FfgEX^%TP68S{K@ux$mgq^mN<;>TgjPHo3wedvV%m~a)O5s?Cc z0N_BTD@UZZKrqIl4-$@GM$tsfQn;kdp6IYsA`Z02ykdM1NEK;UWn)iF5tY!8IUeAr zm@B3Dc$)?un?lwIp@}p&@art8E^2XfOzaALi`n7X%BaN z4~Akb&jt3zlDmkf*eje(prI=TOKmXp0$nI?GD&>v2i&!w7(8n^-1k|UCSs2UrygX2 zFa3#!=mp=g3`U;tt9orHgOxDct3+U?nN>;mDiD7uVIXIbIrjQ?FtDW~Dr`V`B#I_~ zf^d;E=zS!`xdgR@wK8d5=K;_Q=K&fnOc%il!X{RYSV{Q( zggbCG8&3huF%RHVl7>$v@Px9F67+jQA|b?%IBc8m-o1+i@JaKAYdKRP_miV*Bbc(~ z&0LyR0EyH{`od}g;0JnH1ot4)28p_+hnqM86Q*x@6X}QgP`Xl4+V{hvuup7Ct>HHB z`r6x~JQM0gY_GCdl#p_qm zNDbwm3O_Ce-)kuTxE!F5E(qw?=#qfGAWA5`dRR=u-O6J#J=7D&L%jYcXf84rnyFo6 z(Pl1kXtP4Y-b|~K3yWS-NyE}Ot)JoMQixRYVcwU{z}QaLCI!~mnQci%6q(@fn!>F| z`_I$;V;`k%pN|DUv4!us`$C@VPexwg4IJ-u|3tbc`;Oh;pPT`a?&I3;_UDPcHaUZC zD3W$ynr%`AcMKS^fZzGeROwo}!phJr9_s0hw5Kf>+M7t*^S^Z@Y6dWNZFNCB6J*lV zjS50pc<9>aQJzWf4-v4ikf(LNnkM4^S?6oBi%2D-wjdR{o9H4-#my~zhPzi&QV-)k z`BN*L|7@oB)pZ|Xfqx_xxTb0?>b_96W)22m|4$RZP^!x8!HmyhI-`o6Bz3Iuqe`%3 zvu)`A0h`^rCRzV^X0-M5yNgC!&FV{5Tf?p>ZaxDcG6BU7u=57Ud6OID-s3_J++g(qW=RzB9v*dX-X_iLb;g9FNboxqE%U^$fulQnxSr*ap?xVVVZBJ z+=*w@Z94J}H3V`+GB1P^K~PalMZ&f~_(e3uOmVGPES93tOA4z?LQ9yZJ6^aJUHL9^ zG_n?5?=HzEmxQCs5;f~+T9q|*7rpv9H5=6YBK=IKqWNg*^K{V%rie*8#nQFviO}$m`9Q5#C$aQ6y}H?W@v`0N8K2FkzH9XUWOjQ8z50uKYiZ_X zr_t(xYwNH_?0!1mbKGhiwx8plOQQ!lnqA}5`P{REPUp3G&^4buKWZ)>G#9$tYrl-( zpa=k8Q)*8UgaiC``O literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc b/venv/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3be3f3897daf592157ea4429d825795d92d323d GIT binary patch literal 1019 zcmZuw&2G~`5Z>J+j_bNri$I7AGABsY#)no2352NHB2MMdRM1>pC%b7jwRg?zCRM6( zp}Y(a!8>sFl~Z4V6SH<&ICSlq{qg*K^X+(hWhMA>^z-CVi;&;szp;$#cPNIV;-pVF zbhdw9Uxwbcnx z;b+2^xnJ)&J0hL%^4D&ZOC|F(i_COjgpKqlvSSftdYEP+$~B+jG&O=psg0zv0tyhQ zBV$vr(;|2w^Fo6~gTcIVO{8A(!kN&>Iej%4#llwWMwY8L9nmYbBtUCiMRwY zwAnlwfzC0S1in>Zo_RFXT)cKbsvM^^zSCQPQW+~!{w%mb?#N-;xR9zhq;7-5%?xD^ z#e}FVnb2$G_X$B3*x`*c=&-V#)M5MU$(gWRjM8al>!S`WL#`8KsNVk|;Gxr>5Am@P zVB$3A=}dB?Rm{aKF2>sGQKm2AnNYKMAXVJ$#+e+%#oUgy+U~xLlY!QYXx(C7KE#wr z?MMLfBox*w)tT!FJlXHRvithXHmT zfhDJ04Yg{!l}oXXVw$K(!>9M>>*B{N5)uj_UuUy?V$eop19RO$mm$bjEvLs8@nN%ZPw)Z~n9~>R@%7&Sn z(l4^qjx^+p5=sw*!5g}-ipLns1gHoNXh_%EP1>Qo#p~luCtMGc1Xj?ZN(`&GDub%4 z&4sk%iVSewfz0gvPH@iW&PNeWm%>~Nw(H2#x=FJcWm!;IPZ}h zk({CK8%pGa+U=Td)>-Vf$+k$cZCY&GbejNe(4s)l6kRmQ25k_eC{mzkJHQqwf);B8 zMOy?#gP=wFedoS+=e^<{Q@7{Osx#ygF?m6e4`*^;uFL!U|dtdyQbC&f7 zR^)RS`AK~JTFSCqt7y5ln^>}!6UD@GvY51aom@&4Q*O#lyBW8~&APpA&fVwc-9ESA z_PYb_es|D4;10P5-C_5TJK`R8kGMzO$L0?g)9&NNjMw93-6uBfO}p63yqDXw#_yi?p5C-=3nde71|^xG z?gZ|faeHv5$D2UiGq`@v&Eh)iox$~U-g9_%GYnq? zp>8khN^YOY^_g71$?Z3}L6aLYxnYw#WO9d1?uf}9HMz%`14QTDK0wqb5S_>M1viiD zymt-|Uhpme!l#0o&$|Vb6oSz_kGe0o{kYQ~+<5_aUUc{4&VKKC@2vO2X1e$y?p<^T zaBm=}brE-7atCo|(0dVmyyU%vJ}w1)TyhVf zCU-M<@|yb?o_x%kLYuF7uc7wqQir)*P-n_LiaJN7&Mog2Ng3F(Y$+g z)^DhCrQuvF`<^qkRQ7$(cSf&XoASq;xw>*H^`#}R(x}#J{Hk^j%H+-k8Jf~Wdi&Es-iQFd?dSi)J58A%%HOj3*Ip}-YYb?~= z=~nO62jyy`JiFwzdZ+5DzS^kPyjI^;f4x?@)$o**L@pb3)hbBoYhDe-yw1K}_7|jL z);ywfEbVPq%)RB^_mp2{Z|Rw8({tHrtx-mwXlAOsv?R^srVIjF$r-QF%H3WS7@6<6 zU0zuMI$DL`W_Z0X$h=+k9<;J=cTUw%sQM+= z$JbI%A=%R0R0730lyIb2GSt`#@qPlMK1e+wn_(|hSz+S`Ge;vt&b=P{BSi8Jo zU$;KE@G!YHv5`RT_`}pjawB!uUd*Ur{%#}>qvOS_dZCe+vEH=q4ZmYCcQ5}AR&k6n zF@0w&+3G2kmQ}q}YGq3$w_0f+SD3ChZY{4YdCOj{;kje!mOWMM(euJ@B~iVV(N`_| zS|@%ArOJX=Su6$B39&zj#IiGXPW~0_l$}XrZ8eU&G1Mh-V-jC~6p3dQZD=5gIjflT zQq)7RmfFR%mvNI^_mJ;#(-=oa^`g2#7!k+s6uz3Ida#N&1==yYmGZr%xlYi5fd$Oh zQt4ej3KCjYqPahu!V_U>MM_wRFF}@`hLPE@8btVD!``r=dH~r(I1sHSP&$?rKxNqK zByS{I$;y(iINDBF21+G=b+$qYxKOVzmP+rVl1v^8sLR>S!x6aRHK)h2BxbF=?17j$ z(6{ccE-{}kmF}&Umx7XBbg@)#_@$EKChLB)r{{}GhwVuorzR8p$UQ2u2i_R0djPf=LKuxKV?79|bq zLre=!h-PKRtGQ0uxzA+>D>N4H#)60CJy>Taa!&Ah%WJHvnp5-E8qRvvTXH=&cna!( zDp#Q=%rxpNvb<6+Xg@g(mh6j_jU|LbT50LFlTjcOYVLjFLU<(IESP0~f<@C6B8wmX zvd$E~KFP6>aBWQdBO6Ki9on!zgb3J#oR&MiYJ4Mc*V;&K+PIT2SeSoH;4jx4Z>{33 z5PZ>AejJ!6Jg7DnO4P2r*>YuZETvJAY^<-elE6nR(U|STNV>70>JJ`rlm#SKI%{Vs zypciz^|#R@^jf@a4RDWby<^ozQph(FbBV>Add7yZwyiH(wcNW_1L)fX z>Rd|AWOG8J$7o46)}Yr_Ykt-3$|=n!4f{CN`C46pQ)16fW6-Yxu2x^{wxVv(%D=T* zYgCuL8%ovHHlie5S*rWq*HK+Wkd;i>1$z*SSriviCpHN<(*+lgArq_-BYKT+6I{$T zv5d(|k)BpEr>R~DsOlPWkT0BAdzUYN9kq>o8L*p2+LY>CRy$C5jFxP z`zG~eS?EdF`Fu84!L|7$k(kC^HR?$pcrA=JH@_>+J<77TTgTX^a!g00oa951nzH# zUF!9_f=lyBA~%Vz&vj+HRY9v^bm-6(Ba&|t>7Ni7p?)$-eVApWzOJ)n1jMYU zlp7I+zI#`Sb$`utVt47J3yX1KkxoXC2_(f(C@D5!B#V?tPOBRzmoC6*iCa;I(|Ug~<)w|*pFut^ zN(j{v@jyZy$$H|46gJF>UC^i4U5tn%`1kSk2as@0;(Bun>FXqDqPfzQ9p_YiS=5s< zZGS9@wfd^>%!gKfTjO{q#+&02^(4-n?I*~-Y4|#7?lx>h6#q6M7G6y?N2DdQenps7 zDxfBRDH&y)9n)>KyV|wexb~=n?J!7n9S{ZTmwE~L4pl>u?!Sv~sCx}{j8ky5RRfbj z{s-bL^aQCmbI z%|B74pX{JtS1oN{S3xW?ILZFwQ0*d;3Gr_b4l4E($=OW)vsBjT{ECTQilhoVq^OTN z#I_+VJQ#X`{6Bn1gd3bOw*tp2LP zX0|J(gh=dr7t#=}Kf+gf)2k&BXFhCa65mg&obAK2TSy~lBU40-^fz{14M_lcxhI_M z*F8ZJ^){;Iw6nISw${0Nz$c+zrm3y9lFvXRBkJ>}c{^Yx-Fz2jBA*IYcGJa#q@Uy1 zl8U(9J5Ti!nvkcUiyhYJ5*@UYr*=@o*tgmPV-dI{yCj{vs$qt;Mo}ZGhV9~j?L+k~ zELFkHz0P)cCY9`fcy6gQW{3pKti3UUIp3}mv&{BPsy6_VU<#xn%zG!*L)f|j!!-1TT^#b+yi>i7Y9pY^pA7mHk_o)AFGZYbf+Vj{| z_2p1sHRFNXu|1wYbGPGXKKMPWxZ>`*Ni=kGHMUXGU9%NFr5*5Na5Z+pN%Ki_v%3}> zx*D|_OAgpUjTI-~42RB{7WFE&hy5dKuV$5!sTFfBa^~+{5`I8HIhBm|dZZ2JBPg!2 zYH`8o0B9HOh`>G{vdND@aV7V~#31_8;zJZy*}j;L?j?5Jbi%Icl2+62nm%H-v$Y zAQPC*K#Uda=FxUU3`p3CvP@S?Y-jb0@O;Ex zIN^z?&xDWZaWry;EQKDdpTJkE$Xc!he4NyKbE&eL_gksO2d>}A(6EjxhzTl{zC}O- z0kc006Cy85X^cjD3V54w**Z+=`c4yIfL@K+t*!&WBZ)10{~ zqSd@{2Z@A~VGleA`$8le_rUKgpq@lkI4i1-m?%WVp-x444Np6vs}-jjhU=7RZ2L}q z&H)3+^Fbg^u*EDizlUm9nZLDhpA0E6Vd% zml2k>E{*ytp64Pc&u2~P+4q*q*i)_OFub|y8e)my6!%;YgZ8AWQYq+l9`PyT@)Vv% zz#jI4>PVDRU!j*l2KAu2wB(dm8}((}AcM2xB?N^z{%WB8ZS;17I6yTS76p| z<`BszIs%9!^BQ&dYsNy;e21}E^=DwKr8q9|9JWK#>McCc235`Q@@*ucKmHDHI3_uU zT#ImGo9v&3Gfl&3phMB8f-bcu=-4|MViy4C0mb*a1IQu+;G?jDWmv&BtYB@!3f&MJ z@PHDWe!<{WuuH_Mcai)Sf!>Mw9J~SlQK+BT6MpwXeeYhW^n2Zr%c2-`gm4O9F$*>@ z&ou8f{{^%e1oW;VpcgSN;jE!>;{4V!O*Yrcwe_|DtkzamF`GpgPypV>PH$8UK^$tC z=2W8%K_=?HuzTzy{-cbzAuWg4h+Bu)tknTXg^@M_PbhI2SS;{KzpTxV%m{Gc84RqI zs5UxhNTEc~#SP8S+}|gzWWx3|2W1Y&ievbqVnL?#pFt9z%O6{JlV7vu5GRFr$1Gz! zc`AYXF4IPP2pQr$o6ri^2ZIk0aP+Z-;7^Dy#+=?u#GLGjR$}5gaX-YoDrCt&>Ag&A zc5Ovn`9U~{l+}Df3nDBErP9RZr8)$ze`Uf{#XgP56`HIf0@eG-ZJDuQZ|sP%rqW!C z-H1sd(yzHM(v?9}Y}Rsz2I4t7Co?J|;yDwF=jPeKPjg2xrVPCCpw4yHcNWU`J*Vu{ zRv zJL@=G<`BOtkzt_y26o!w)DH3BqXnP3`G)nu5UCCMl;ct*)XsI#JE=ZE)t2qIY%HS4 z>V#xaUqbSS90nN)lzv>JzmA}oy%RcuvSPZjfI#(*ZYadr|-BPZsHpJ#n%~oBxx&@j))ZR2HCK2NOohcS2#H@c@O$85Bas zh<@-80^@Efg2G3ZHhV)Mm7)&z`+qSMKB-ZtJ|i4Te}Y4pNxIQL?t;X8wAUCGIpwDC z^%-<)W^D%+LoEwa5!fBUcf%U7t_4A8k3jV{YDn`nP77*$+t6If%~HTEY-4->qCk7s zeu&j$!ybaxdI%AyjRZB_heb)^y~Fdl%lZHd1a6TF;_&(-NMe9{mlr%w8@^nVVZos9$ha>IGxVFj<9Y&gbt(2@F=^qLO2jwiL9!2&MG z?fryntFX1^ob~!@_;?vhg03Zo7-C?>0`p;$=yn}M-LEdWMhBs_0Z5>F%&pes{80o< zvCx*OrOYxg6(&-H2YJvKHKjs5 z(%IGOQsXqvXF*kJdNq*HAt~CF`-IDa;^JSu{Xc%FKB3NB{inCzOD}PX{)Y=+K9{tr z|EABjs(XSdk2WDE*U-w%*%jGp6r>Vr|X{AWpu^utfipkqo-z}zY zU!8fQW!GBvg1U_si;0CTzQeSzL@#HggDO^k#?He~l33HC(;J+!vY9G*Cq*;-I2FrAkP6nnQ`=r2ZoBRd^3AAy65K%Ud3k zIo@YokrArSdrmx|R1{P2I~0f~aFxxa82ypUrtuGHzBil3bx$^fl%JmM9ANCY)4_t! zJaMt`oB;AXGXUX(AU%C%AUH8l3_|saft#ghoGgKZr7v)>6x<<*jf3g{x+;GSAYXNs z^?5g$w|~wYD0HQWZ(lny%C0*Ke+RuPP#!CouA^gtFu3z$@T*WlQN)R|3(?}%>0s*O zZIP*r+5cI1SvWsImbUd52_Nad>bkV60=Xigx(DJ%%XF~)_IsnPB#?NCQ;!{4$!2)6 zk#h`1u~mCJI4-{BEyIfy1;uf$*Jb6<2S^BH`v3;kp;>IaHVCk4pxe->>1G-91f+d6 z0_31MHrbd6ierFsETUdW+!@pc_!kDKW-!POY6Xvu*f=#vLm<(7z6fO*}>UP!6{%*$VpGRQulWmMMepVu5%FKRuOzr`y&IH#3pqYdnn_jscl;gaa(a~v->uDF+glM2{Rpo$&i zGE_5zCWo0pkKf{y_Ub5RK#?8*^r%v3PTHv{LVTq^0^v^d_SV4QhusBsqp$3rADDvbw_oiLH=G zU_b-hAQ^}dQ7Rc;Bn|l$8q%^{8y2gw0IL#%()76p`#K1BN7t*U6}q^#MJ<-5Dwn4B z4Lbp;fFwFEf-2o%aR|#1tyaUzjl+|R!Xu2m8>z7*R%Q7tw*e{;paT)qgmt<@M0Y6_ ze4g$M30|8dr;Axdm#esvAKGiD1c%4PiA;aYb(BFVCa>QcM?M|q+vCWn4YVI|C(6># zvF#1v9H6ZEa~$9xp0lW(B=mV(XeNoRgVlBf>dPm_3KO`sWw0YL=CFf7jI;-l(1X}B zMa0;nTn`K#4e(Y#rQY;de}^iiRsdz>EF?KoX1-cuPUeeXmB-iAmzjKp$zNjP#1qaS z(J{se&M>aDR+LZY)7cEPqO52~eHE0L4^cLWuTM8vs0Vc(R)#(!=O(w`YSJ4`(1i3h z(>^y@%*!t8el>)K4Lg!jTUR)980u-w#H`fVr>Za1Nj0BoTSCO9UPn=y$+*|&j8*-Xc0ec_ltuYa)29~%Bb=k!pg3} z2l)_27VHT&P?_xX$iT@%0BZ#OZUbFf>ikj!yuJ`TDcKWzFI=CHW4AdSSlvtSWMY;>6anPL(6tf8m zKKzZ1(zT(afq~FlV!HXvPd>-E556%1PN(qw4-ZFqI~ejY^>7Ra&NA@bz(upoua8xg=l5f%WZD^OI+;Ci}p)Yk#8j`m?FMg-jsFNJ4F&tGFVl-~^I$R;}u29hl& z@%5>0Z@bFM3qimoat;;V27L;Z@~=COusdyVX-e5}7kQ0vZi!;+po)fBAf-n3I|d<$ zOMe4$Qe$KLeLmEW^W1n+MxHMkCcaxr6h}9B;gVIq*6dC)f%M z>D8SX8I$#IBOUIKbO^Bvj=-Bmx>CCBt`f1qhPslQ1o>_D5RyBe`V7g<1!a%qR^LS3 z-N^l)3@#GQkz3)bk|yHYzNSNZ;f;PViHi;U{lvq>!=#Q#-bfsVM?7L5o{DN3@R}zV zvn!Y6H`F>3(>DPkCzw`<(mJ|?Ht(|fDsR)SZQ1uDxE5X|5q?16^T^N=;A;vBd`-b{ zWEkC;2oFKA0~+xa@8H@K5NHgFksU|osWQ#!J;y9|UX21Of?x-BCR6-30>$<%*xJp( zC@>h*XTV@&fq&0VA`I5c!I%$6IEk|5e-&+ZqvrqOn6y@z z$GScMnl=x;ZC=?$xo^T-&FaLV5?YR5hD(!LpdH|zl_sTZ9zQZ6|CsO?LLP`g5>m2z z=;h7=g4q7=Y?~U4tOq@W-h4QmNql{Z<0$o_F{;SRdLTaN9=uL5ix)cDvNqtAlYC_* zG>RNwTZ!L&e03#$^RU!tf!PT1>jRngtApqwW(ZNzPO)>ndf+uBhWW+%iWn?iJx(ye zu*d*CFv0Q|NvL`s3A_-Y9vP`-IFGd4t^e&OUkhEk-jeQmV8^aaH8XUQ*$B4FxCjlW zhe?PtCor4>4<7>Opa8*3GWwx-_UP%`uwTKeZ(vH?*hnpBqC+K{1wMHDQqk1)oI#?;F zDU}5M@Yl?Vanalq^ph2|RXMsi?%bEK%)m+Rf*OK!zrO4_qd+PuP}Gb$E9I&(8-b3) zSkJO^?sQ`n?}~d_oR-?3-bU)2bDfyg4qNjm@YW=@)|p&nvZo2u1Kbes6GUbKk6Az_ zeVp8f11g8(R3e+Px)F$+K!%e)h5L5=`h+-8HR8lu0q=CMxq#glc7_dNzAfUqIBox$ z8CrLZi~gzSI2aM_ZI|s($3V2(7M0~g*~m#L!Q;P!%m!Ba2Bw$ZKKK$`?+*hmaTC~+ ze-33y%{9Z|9BwhF?{46|v0SSV9gu7!Hxp`h?MoX;tYicFJ%WcZeK%5D5S5|6t&QjXnOaBk>Z(b0sE7KjnN#QL(iEzYVNm$dWh73T(gScZXFXG^0?c&(Pd zOQU+W(GAva`F^}v>_uV29NY30yz^olq7U;2|8=A@q}c5GB@G{@B^$aKx?v2c?FO5Z zh!(G?>I(K1oRb=>C%NB$GR|SRr#(tFZ0-X!H3SmOuQJp?Hs71i>PN9l1__PV?l=g^ zSgs@B;jF2Mn1p!<-ltuCHj1u;>9L+x?;ULD>rJQ`+|oX7x(Zr7AVRs(P;D;*-sDK0 zR&O#9ua$T?M7oNOo0+Htp#u~y(8C?0Y}ck^qR`cfLo=58874oA zq?OSup}xgC;!YQFMwz94j>*q6apDQ-BAU~mQi~hJ6|}g0`BXlYN#qOJJp4gNE4XVu z>~s=e|8qz}jV?T{5sfAYj%;j=Bp476x*hSL?-Tv)2pVjDogp_8>C!$%04He~Yh2kq zU9aH?fgil>HrSd+$g)0Kfqe&YreK3kVtdR%2)I_f2ROJOVK3Svq&NH{E_A)^Zw^yX zUhGkqYvpd$TyIULOkkn5(pBDy;9Ai9AqKbz{DpetQ25?nm;=U_Zx%lynu}irUwPT1 z%gtIxZ?lP}AVwWtT$*^%dT8H+O#pcw`o%8>)+#h!_{FLB;w4lzniBZ{ru{bZ;rR!< zs=666v;gabSM(svPi|3i;g)U6{SoLX&0*3|>E(x@^E-vFgiNnF61FxXdu%kdj>v(H zL}x@WOf5lLxML|oq#J0oO4bP)ReQ!+iiLGB0@61271!YkzT(JSLxdn-Y^e3KO&e=u zK}QE3me&B^8*CfQ$yPRenL#U!;GTIMqZIli{wCV&r1u-R_Z0%kPAz*FvMd5%*c!Zd zq)Yo%NmLh%*7F@)$jd5w)o}*uEm}%|CdeBI+j9{l3as)qmc8l<0|rq8zgm3&V<12o zVS{(1M%KS04hzVGbx>r33I&&ZQluuo38fhL2Syr(oxn(duWLqnGZdS!)zE6{-gUg3 z7|{V@Bcz(&oS6`o9~H%O+<6b@ZB#>k>nk7VO(h0$18dId)1ksTS5;V&qTTnm&e%l^VbbHGu8f6n;53$c6=c;VnUwxqb<^#*CR9oFrrjG@`dI z8&)Ku7kXM46y3ZwGf{zA)X+#3ooXu%YpV<>A^Pf-$|@`_9CMNoLqU;|ChV0xo@cMe zksv7j2!qmb1R?7qi~zq0mC&!hMrgWC(@$i@w4RX(9b`?MKzhi;bdc9>VFsvwn^@6< zYaTOWmjQGOQl|%Zbvc|qroFIj3QWXEaQHtTHjG`bHd3VskIUQ{%Xco2D}=3MpM>&E z?~`z5Dw0zDJtj^(Vc&|YQJFnc_%XJQ?@Y$daweO~4OMW@d%ofl?z`_gGZN0~AY_W?0=XhqRd9;N*No0xr?Y4_ z@}lAPpdA*p6B!X<_&XdCxsNe}u~DEvkD`W5IEv2Q@tCIu`{ZsWh!)g78u`;A@XhoF zKAIf=#EAH8MkG$qhSx?P#OwtTb4Z)Jwk!9AY6V5pVRP5h<-IBD#0gCt!gCb|gk6u!dkbV}-# z1`%Wl69IQ=W&&Gwct@geDCOPTh zUm5V>EbpYTu3}^$dCDxTpT?a4dCZ`#wmU(uW!euD_b1Gl7%(Bm_U?q=zvG~(=P-^BHr}C5$_4cd=W)pV%8)6@V!=%qmPBjuWSO2hw`V30Vn_}Q z9St%Pea~1Bkh}q3G9)7mr`L`O@@M!g=hWXvr{VZybG?gp(8}lz{v(GcN*^M+wz8$J zBaWYBaEM9qczZ z5Y|i!C-~@i&0EHbq2G0>O3f^A1k!TSt>6y+t_mlusKD)JWM+o=5#iVcKVp^sfXETr zr^E@^j_C{3B|21z3V!&D`Wh`>I-vD^vMc9cMA`)YX{}(k6{8)r%tu!; z!4w?m4nj&I+x{!ZE8|IRWd#jqY`BIC=r9cji?Ca>ckvG*oeC#9xDk*-@$i1JkCV3D>@Tv~klYKzX;@Q)b+I5**wil$F4b%E@q4oEUd+Q8 z)vlJuq3!lnLG}{Nbt~Ddt`ze~%q?hx!N`1U-kH((@c)D(@YOSfH6J*K@z#vB^vA^vj!S;XMidfRla!N-v7^U-;lMNyB{}nDLZ;$9oS;={L|X z6s1O>-z~`9cm1xWe&+Twq0EuEqnWF zg0<67tsKJt>uUWzf|JA~Xr+ZyMEz~0NUCmA27eSu|3#Q91l|8FB&h@}O<0}$6FvM3 z5A>blst2>lE})G6@{-b5!vjx+1k*egqypAl{zV9c83egRI-4KtAM76(%O#N>7-ukYSYC literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc b/venv/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f98b25129fd8fa759070a5abe8d783f5c78200 GIT binary patch literal 7867 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 VP?NG%7`16%SiXdxvwVE6@^9h?y3YUr literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/base64.cpython-36.pyc b/venv/lib/python3.6/__pycache__/base64.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac86b638bc4bd03458a5cf3e8302faa7e5b36417 GIT binary patch literal 17167 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 waT};Vka^KeX14Pi-ZTBZxtUH||9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/bisect.cpython-36.pyc b/venv/lib/python3.6/__pycache__/bisect.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ab2db22534df7be9aeb0371853bd19000dd635 GIT binary patch literal 2708 zcmds(L2uhO6vs(Pb{yGBGb~-Uorvxd4VyKrzz#)L3@rvMz>on=wze(?gEnc4jVwB( z>^Ok}6ivU(KE%F=t~=#0?7q|9qhcpW(_uqbAeaPF;v@AQ`S|mnzPqv#9_;@5^plW~ z-^it_3Gd%Pu^p%c=@8Kpz6f5?4wbayi4{>3b!hq0?*w91EQtoRYT}ky79qUVk6MC? zX1cUT9+PZ6AhNL^nmtPJeo8X$2@&2diPny9KTuZobEPxJ)1fvhPe!(V24TrgKfniE zH7Gumhfu75s_+EeCuS`NH>dO^EqvkcHw?>ZK~Cw3Kl`%q3Li#1!siAN!N=qzD4@3p zJ|bZMt_V*2gF8haY8&LlJGk?h6y&)Fqv@$fiSS`^_2WObGb>HbR4zws##F{qWpl}aVU&=9bF{@231>@FEMk*UJ&Xhejw!@IYwLQSEEv(Q;E{@O<_)v4_EY~bgBr|H5 znl*(+AM-l7k2}~8dyNTFT z^(98&7_%ptmE80bDcY{vP{{4^2DlzgATac2I{Q46L!PUt+&S~0`wYiKei{D6(~11n z7;Q=)qLuY(JyETsyri?zOLgfbs`N)n{6b6%KKpYk{t*&tV?Gjms)W^9EaWsECpy=I zR3FAunN8zV_2ThSp6Kju`>VL;0BMhp$`(X`Tz6fbkO#XC6JDj(wn!anvkLa> z@p%G0?*t#@xz1ledLGGqVluajDidbukrL|c=nKt%HtGM&XnV8(oY}) z2O86qff0~;c2E7x5YKBO9jY{S&dyi!99iLmT*B{fPH_e9!Y9~`yeSwP#MmG|k!Mh14C+f%GfVj1 zz-k#Q5Jh582_3stwF1quRUuh%_#s#-4x86-cnf;3=kP6L%!ycm0{H!ffK`Hat&IJ? zJy)97uzMFWmde3G#qj-RiP)vx_b+ze)M2Ck1p-ZAAEgM_7cU67qC_F+l3BY-0Mhpm zKY0r!`g;Oym=gU1Ap)`b&y=Vq2O8BDwQE7&|5S;Z=SqYNbxgSf@rn>R4BrFdB3jZ< zLG$ng-+AM6xm@aYh3M literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/codecs.cpython-36.pyc b/venv/lib/python3.6/__pycache__/codecs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6725fbc698b568b078d15442896be06ea75b9acd GIT binary patch literal 33957 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 JFSGjP{{lwmI?Vt8 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/copyreg.cpython-36.pyc b/venv/lib/python3.6/__pycache__/copyreg.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40c9d53dde18290988d6fb274c582cdcdbd5cc44 GIT binary patch literal 4223 zcmZu!PjB4D6(0_{T#8!DvTVza?Y2x{w_d=OTsR1V)=ur_Pkm@r!*(iLK*La+S&3ST zT+hr(T7g0U%ZHxw0n#FeqL*HZ=HA|VDEbk2D$tXGeu7@y-y80(WF;%ja5(d3-kbO5 z_a1MbIu$;D{P$WoX4c!57kEwqrYdYSbWOFj0i#1mac5cwrm}`4imGYgSkLlUYil8 z#XQELI3pJDoE2xqIXpY!yjaBZ6nM^|okp7%7lezsGvcD~@LUjYi58w`h5wj!uk8Qn zfy@U|MW&1fs@%zhjO3n?h0fNqJTs%HSE^``rTttkh2fLUOh@=Hi+mIfwd@UZ+L;J3 zrit`$FesI=+r|f#MPx<;sUsnKSs_J~72$_BqM~f5vO=4rNU>h_=uCBULYL-=)>1Ep zwckik&!#1))i5=ss!xG!Jmpc(E4f|n$YV3-(_AL%Xd+INbW^URE(}FKdQ$rkP2WIg zSmhi#dfqq!&lgVR7+$eEtm1<8XVi7$R{YR`Ef{piSN5+eDIiOR8}^2U9q4F#s7 zNnU%|cCrC>PI`h^JO% zvv-43y2U?YzrAw6$=L-&SBn+j@=WU<+(a!tWX~5@neh*J#f=X|JP-^jh$;limV@`t zOAO~1Ak_=VgOEd=&C>BoEDv6 zsXGTgs4tGG|Itu`vk$=JPYE`Ir>trnVy5!dzs;%2tNb2RP9t&;>!tq6D^f%~6UV(g z+0b#ke<4kZADIbyT>}VN$J9il^U@H_N)lNpip*wW#wezv>3X!AA+Cnwm8{sn(uOqF zfN=~QCX=PWut_u!2_5Ag=CbhtyKjuY@^G|zp< zb3(2NcBes3#-U*Q1)8QXgrA`G0K{MOF9~!Jjk_VXI1ep9b&fs1)x<#>!XQ(SUsg>9=&@5Sxg(52+CSEmMuS<4RfGw z<1t8T?V0X66J1T z&mj6=Nx+GS9!Xv1Lt9+@S_zbB#2C1rA}N)D9N@LW1LQ)5LXJwr9*R7aV%$BYZP zrLKLe;i6;>Ym7KvQCHx8>WAp+**M;nNngnxu#5w8Tk$o0O(V!@S^XGYceWvQ0ZJ;O z*&m>*!%R;K$l66|Sckw}Wi*9d9mqm7BR?4o@S@(KjRaKPmJO-8Wu;N4F}2pRfM0tw zbuzrdBhfzxtt}T>2Y}{yE&&;LJAk+lfajyfEMIgM`GQMu=K~1UPqAx?K2%juB-$wa z0|uyOP+20fkT5*}Q{O2sAr_s&r5{ z;XOvRVK`zg$G#SgE5v9MS(K8Ehqd2f&8Kn2-&g}JDqf0beh0}Ik=5S6{77yfo~#p2 zz7J6JrlpWe>LTRNUcY|*#r_$Zh$t1p8&y(l$d&yra4$k$#aBa;qbL&;8_i*WRx*=4 z1|<7e?e;fmvx2?}Z0I%zbz8NY6{Zeh5cX$YcW^7Yh2hJ7MxfJ-r(M4uo}M$zp&O?A$#0qf+}5i|JJ9) zM2UcflNO1hPw>%Zq&8HHP`+8(zjkB>szxTePnci@VetWkw#rjKqtRV-_53jfr}Pok z_0&CDB@L?k)cu?~$}CN1%Xw17U(qxrSW;l4x(-DIRF~51X!YWJI2NGv#cnZ{)RSA_9zrG`fTZ*qk>A5X;WF@lMJ;_06P2KW4|{PF|21+ z5cIYfv-Q8NkJQ^lNEM2r+QBAL8^?`~ta?Z;>nMsYt4NIRlCKW#G(PtMQRpRf9!jK; idprySpIf)`-N5a5!HnkxZwGGR2k(1uGQ2GWo&N(mGA4`w literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/enum.cpython-36.pyc b/venv/lib/python3.6/__pycache__/enum.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43bbd663bf514f099d4f1a5da4d752bd54220a0c GIT binary patch literal 23439 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 F_}`Qc;1d7< literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc b/venv/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57d81961e8d9785e644f6d64e4fed29bbd55ec7b GIT binary patch literal 2906 zcma)8Pmde76(?s#BWZTM-a6?fz64AGr;=f7TNo|eAc^ZV4q~I(2Jr?)y4EKX!OSWb3 z4I73kIB3g`?8@j{Pp--JZ`dgxcH{-=L)w)avV}U57iEZgO?vlPe>47(GxlkksXU%2 zF^O$5PV;^7EVW}{#wyFiG`3dh+zg^Sc$Ai;!Gq(eynnv7WrUlC5erCouxQ?7SD~a@gdBSl1OuBc9vWCunU`` zS)PzBBZ{fgu~p*fTv#3FCX20`8%mAe7!6Niq1FB@i*=+WG|;ZXDLE};K8)Wmtks#!Jpn;D`bIn z=Y?H*BT_r)M=yX2wo`?pG{bIG?Pe>gwWdLVs=CVK?qA!$4bvFq0O1NRZCamIG+mxVTNrP$2v~1Y^V6psH4Z{?2zJ0gRla5 zt@v)OxtwsR=z`nmImO#KhNU(IP64O1kYr`G;8fB+k->l5Si&ayY9|OF%VqW7PzBJDQ~c1?{y{ygL%}Vg@YazsDxTxy88D zToW_U;oOeDhClWAeo%RZsREE-Ty@9`az|5|>3dZ`WUqV(e`0zKeP&NU(I4ZJ2q!7i@zb^d}8 zhA>%s5}z1EplaFqRLKP0?jc`R$ov2wmX*u`fx2gbPl=X8C85)^yhI8_kDqr4sp#`< zaL_9KQ+^Nvv);}kx_kd0*KgkZ(_gOtvEQzu6zDNF&J)c1bZ(WYd}Fn4VW!H{s%kfE zuUZZu{Xj<$4cmyy9u$Xd><2X}9}O3!xCk|j?Je{gs_FGkpkY!vXs}OOUWmf-|hIFYQsJ#rLrrh)g zyk-jp^8%oz!z0A6!#7cG@(sQU9wCMFUGUyS188x`C|xd-{IE+XSp56{N?X^!@FbhL z1Wd$0N~iR*3yul=V}aa6M+60@fqAcwWSAynm!FB1|I6>1-WFr^{%nGy4(BDA-09aS z==*gD2xE0bUJ1tP20#rKcKC`Y6!#TwJ_CIuC#sxsk39!9BuMccKe<|hB8Tidu0Ntg zewhIgT>5W8rwn9p=;@D3U$*e=A8ny0M9(gI+N++iEwZJ*hNaeJCcDu6 zx@e%@5Baxq)wAUL;+N4fCx=zTxCTu9qS8%T2H)9C=&yT7BysIQG;leZb^z zN`H$1E|(Ug-R9Pyu<7-Er#ac^{u00DBCvvr!cphW2IOblJ_>O(D{vE;C>vj2oktA{ zG$p-?y>J!3y6^^9&-ks156<|*Gyd)wf4uM>q4fyWqci?wXAxd853iWVi*E0hdH;&( zKN=#X`?#i6$V<~KPL!sETZPIb@l^HOHRpI*@mv$1DxOsQVAwKtHX6OkJW56P@S2+_ zSh&FhaINEh#6HSk0e=%Mdbb*0QhS46a+(|7CEj1J+IxGlNcQ&X1o1X()n0Yo4Xr3L zLn?8WLB)r(>SlVj=Pq0>iMSNtP9>L@&$;Q?;ZkkqgGnK0nfi#j3{gLTBkt!R$-c1_ Jbv8TEe*p`6`P2Xa literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/functools.cpython-36.pyc b/venv/lib/python3.6/__pycache__/functools.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52495e4adb4760f8dae28ed7ddb22b2e89d58ba5 GIT binary patch literal 23959 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/genericpath.cpython-36.pyc b/venv/lib/python3.6/__pycache__/genericpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a06a5d92a815fd9d1370e9a5fe134317f177ac63 GIT binary patch literal 3765 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/hmac.cpython-36.pyc b/venv/lib/python3.6/__pycache__/hmac.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8bc4e17ecc7f269cac2c2cb734051fdff81676c GIT binary patch literal 4868 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/imp.cpython-36.pyc b/venv/lib/python3.6/__pycache__/imp.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcb6483d8333b803c230826c2c9bf4ef3899fc8c GIT binary patch literal 9711 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 MN~MB!#cfpn5Ao;KUjP6A literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/keyword.cpython-36.pyc b/venv/lib/python3.6/__pycache__/keyword.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fee870fd398ee658b41564d456f3d9b91f14e74b GIT binary patch literal 1797 zcmbtUTaOzx6t+E=B$LZ#TVN@-&TdPyDZ3j`r6NJ8kSM%RRnQjN4l2=Xj+32aVoz;n zcM~R0OC?^a@*jAj|A9Z^SDyM8;Ds}j6Z@2%E44mqwcr;|^yhbnHeRT!#05CXvr8aAm@j;{FMt1UmOfcYE>o*L;2? z73gq#sN^)<8mV}ih{Ws-wz@%Z{~*!fFiClcb38M08k=Mgr|CQ#alut=ID8srDUUS| zL5hwEr?bH%OiVb-Hc?;V3@8;h5E8`)Myh!z zhe4s1&CP)np_Vf>Ktqc2FdiDN!u?s2LLx?`Y9f%8DPA1J0zx$tp9DdO-(K(3!tG?g zH(A|xFPjIpmgv*1^(RMZqK);wic`(4dq)bS_tlI?4qA&?tRp|xnky4|`-;bt$Qz`{ zh^hlAOd<+F;KPEXk;~I$SWwL|@5ck4nW!>MM3K128A=toMYbbCm5=aSDq;mIY!MR@8|#@D{_w#a}as+ zgr_h-c$HrZ=|vo0;Ltfm&`}^MS*~Wfq&XQgU_hR-3uMW1rmp4;=mnDPfU|UrlOv#j zOE30+o4WLZ1DnR~a$vHs_s(Mrv&rV8m~dC@PX@g;hB<0M6idX%*9$!zR#TJ?J^tdxnG>W ziUbIjUi;3=;#FSaJCMctHzmY-uZnNc`Y%{5=~7z}98rqEq`{)Lwf)17TaQ2JZY{i@ zKH3Sl7Pav7>nvDjXL0`0?yfemGT|x4_3rLs9hn@9;|!~VG9zxVdbth}VPS#i7)umk ziq#%YV>RJQ2bLan&sj&$wPgxx1GNsVlX78QnIWxVQ9u!$ww^XB$!ujHry0W0`kKdT zaA5s7LrJjSNXc1dU5$9RULt@W+u-{+o$)V~k_zPwaHXtwq!NR!_;F%vP;N>G-IglA ztk#f}f#|4`WTxm-QAMs6mJKuOukH{rkwz5^DpPV~y;YEIF-0C;5hKHhF;mvT=zb@v zgLeP=toI#OyY9tPhz}FcQuKfy_Ob(M;-y+bYzdnvY*Rd>0zcl}IrvF;Re_%RyN z*O3s~W-Z#L4H8h-ZP9b|vJ+5TXj<}2erQV1poj5 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/linecache.cpython-36.pyc b/venv/lib/python3.6/__pycache__/linecache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e490147ccfcf256d48fc4b8ea6ca16d089f569 GIT binary patch literal 3810 zcmZWsO>Y~=8J^h>a=D^p`J;|yIL;(MV-v6?wLw2%$Z7+-X;ZXn8p)9(Bw$yZrL^R7 zmzo(`p|C7a&?g^S7wxI19@|TQK!E}U`X72&^j4sN5A_f5rG4I6Qc@gJGo0O-dFP$? z<9Q#wx40M{ZU61lzh7bO-|XDS#rXSZIzuPf9+O-;Dc|Gv*V%LIue;~kUvJNouJojT z;O_bIf~-mRDc`FlEUL@8^q#W4KrYKbHt@C~FUnB*7=`kZT#!wS7UZH_!m6fpwpr`) z$v+-Mox@n9Nfv9-Rrx@CG&YBMCUibhomg~}G}fzOxO13jL4TQvGZ{-^a-rf#p5Hmh zU%+r|tE?ZyhVD^@os_oG#V|gMJAFIukfrJ4 zq0#sOn!bn5u!0rN)S1A>1@|!7=eaPvaHqV_GtXh1sc#l;0iRrBD{PyQ^(1~bLQf#rAru!?AK8`ij1$wwB^Fcinr&L3qOqq zxf=gKsa#o$wOrMprDUPfxAI>%Y#mcyN7I+kF)!c&Z^D}nyt>3|T+w`o+({ogvWaG` z{TB=hIJO_CtA-igbEa&{Cp^0XA8`2K-GUv^vq#SV;+F+~$Uc8E!Q9Lrsu(nK5Up3>{bV_iAP$#v;z6PdF9vu*30vaU^A zCns?kU@$PrAZ`WLS7l?K&01ZCg|U&A`F4#W<0IckX-fI7-oWGQ4kg(67Mgw+9XWK# zfm0pN3CXo^Y!kl@zDw4@0l&gevx(y59W?9Tf5GdsY`ST9l~1!wx=By>(V9$uw_rU- zBFEGQMy>>ysSV1W0@*iSw*JHH#NB1jc~+}D_?)XxDj#B%XX;fZs(+3zRp&@=g-zMS zhtIEJM__7Q2Y&xUwFmy*fWLj|BTD{6XTi@tbn{WD>Q6D#YfRZgL}TG}J(9R#!FPqp zfN~!?g}sFW^Xfme`-`4w_CiGGXOkKL3fE|3P$TU0t6zpSF}{0%>1 zyX@%Y=?#B0*Y@b;W4zzBm@?b-j#=(qr1<~M(xi@Py@cBah*JOO>|@{#PQ7|6=XoWk zLZl*q4u35I8Lp7E8&lqdUG19%ABZO#-vKCYARBs@(XKdb(wKxrqX>)O%o;@iTx*{E zeg;m_xpWu2U zM+fm8A!oUEiij1&-LbfM?i9kl!O)EDQ5Dp^;v28{rXt|kI)xvCKML<{G!23SgBI-b z<^m5rV8Fs_y_y>E<4_D5#+9GJWxXM`4B zK8&%HN{98DS|J6lld=nE6+ux!wQ7~Yexxf3;Q{)hvMv*48HLjwTF_B9XziQS5r?Qc zTbVE7kqWQ=1Re7OzKpVQoqLW4j9JFl^FoX+;ahV8*8>_|cbZ-kE1LHG6}+KxQ^VR2 zC`AZ$)k?XBehE#{8K)ps!vjTu1*uv=^e<20s4m9JGcz}eQ={w^cmN(Cc zbd(xwkuwqZDulQvcGPIbyeX=|uff)_L&XP38rlFdeF0A5;zj#u zd@5+Z=8grxukIpKk|QccRv{*=K|0v-zw?253(=?qx-x9HD+jjQWzcR@E@2d&DZ7Pw ze@f#N)oOK%Ho911|Hp`s+#my^tYh*V9KJpTuq091s-0zU>CI@rjTJ@zWb8HQj4JD2 z%hcPL{vDd8yl0D)sg$LZt4-t|u>&H1A@{hVwJi=(KL1-R>+QD8JMFf*k2!UhI*V)H zz=$RhahN0^tuE%$i0GrDY_&OT#hwEYt019B8EjNe-lXi-gpvdl_Uix?nw}ff!{zYJ H@csV-UYEIu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/locale.cpython-36.pyc b/venv/lib/python3.6/__pycache__/locale.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80ca9e062ed663f10b50757f7b841eb90b70c1ef GIT binary patch literal 33047 zcmeIbd3;>gdEY%727|#604a*1WLX|dqD9Cg#GMo+O9Vl15lN6DKrLh06$ccQ`en3TeH+k(k)HfRBe-f zf9Kvin-%*_^2ghLKIQN^&)M!-pXWKxdCs{PhqrCZ-kAT%7k}fScJ^xN5VzE<% zy~eg!%)|;Y6E}%!yb!lIQAk*v3~{QEvf-h^5I9*)uMZb8@!*+}!iY(kA(J-4CSyiS z){L5**=EMfxS259%?@*y*=g=JyUaaix4GBcw|q|_Yu;e)e>qkdHE%QzfODHU%6(IH z+d}O5SnX0O=8Uan-F7^tpUD@-&6^7o=E1^t6EEyA4;Ah*4;OZtJ%zi?TME0JdkVYF zBPL5Z_r8)aUv2i9%**k@eJ{ppi5Frf=e*%gY;D;6Z6{Z_-;9Q#KX671Z*=Z0JWz=h z-sFs|=A8%b#Lc8ixf3tkYaTUkrMx#&-h0e`Gevn1n#arm;vRBRs}GxltNAN#_|Bg9ow&UN6|7COB?7%;1PMB?!Fl-(-C&7<8Z(WL;C(IaW`^=MO zoVfkwZRRQPlyhIE znHNn8|1sh}U@irt;Y<*J*^Cf>+=;KASbf~g-HE@FaC7APpt)kwq@1js*vvRj#5D^K zG7C?xWyx_Ymh!OK4^K1}fuJM~U3;eE|=gjlw1@j`|f_b}n39R2c z%sWldyo+#&_(fAD%^1flnPr|@F%_O%HEX77)=kaS!!jBl-&c6stwYXJ&f8X>zQgRC ziM`{&mlB0jg=y#1>S=SsxOWJVI^&#jrtc);wCl!ao{t&N{+gy`Zki2#xA<)u-+UFn zEpywv8(Mh}Gx$Dc>t*wP#_$7-#MjcN51X$uA0gLA`F*{4#e9SPeWUp%^UX%?x0r7= zf6jaxzmJ)3H{W4CZvMRaPJZ9T@4L-k;P-9j6O70A*iqRu-)r$F&G(s4n(sG1U_J%j zG@mvJ?=PFrn7_g=2>q}Lem`P<)cjTR*UXQYA2UCW``67+n7?8Eruj+p zxA^^S^Hb*U06$G>KVv>?{;v61^Y_f(H~+x=L-UW!KQ=#Se%|~O^9$ym65cfb%=~ln zi{@XL&k_2UHs%_!pEv)?w9UT;f5H5c`DODf=2y+HnSWz`-TVeIziEEU{9E%y^Q!r6 z^E>8u&A&7M-uwsiAF262@%ue~|JnRLzyD(XtNCyI{=ocq^BTYZVg4t*|6kxg1oV^t zk6wwJ7!U^%Atb?qlz<-oh;&!(VHfzGp0Lt(+R@Vp0)%%1_l8*h`+6X1)f7J`KzOXMkDYEO5^J1nzmL zT=+r=&wwui!o6^bu;6kC$|KNob0J&-Uj?2G;Tm{8gaz<*;5p#=5WfHxyx0Q;{BIW* zgI@~a9bg+D;&*~0DB>5qD~v0F7egq64d4JvAuNMefC{i0!Wy`0X;?nRt^>6Y>LG4` z1vdaU#8Fsr9?%3@z)fI70B3&zd@F=auph!#fwutFDgSLiX{tYJ$GbznEepTG(euJz z9m0FSg7*UN3-KNB%c1}M;IA2g4-o!f2ww{pd?*_&30>1HS?MCh%LpzXiSsybAm_@H@co0{kZyV(@CM+1;Elioz?*!dfu`$ZSJnTox)YDb9F4-(TH=*$Zq?Cf z+_te7?yy&J&RRF{EA8DqX;VrwiTT*x53~C!eLNnEU8IE-fs+oMr z7%#t4SzgHoPt{uMi;kOLs=Mo@X0uXT&Ieh&{DxDdP@am)C{-&ZPdS|0a;4^|rgD9~ zQFYdxS~E+fUew6JoRwO++EQzyE>T^6y;R#&0qgZzbu-`c91~SkE3K24)@IjB4SKZV ztgEt{rE1HTQE8SI86OqWD0#L?1HJZ~X3+7ylli4qt=z2CYg73P&1|Xa)$^U^7-y-} zsy69Rxo+s0XUin;=$Yo|)h`jT}k?Q}44 z?QH=r@&x^8XUZ)qt(7<1BQ?!zwc?p7YKHy^CxIEjo50zMZN=A8 z){X6s&BrF=ejy+BVsFs4eF2)x?|+JkXijDG;lCMZsl-s^n;UgKW9I{+uDhC=h^~X- z37+~?Y%j6C&6RrX@YJ!#!a^IH?TkiHWBz7!$@Vklz7c;JzO?^@1-8#AJX=9OUs9VjNnt;2 z2ZL^O`*_W1w%nR{DoBC0OU?YEvr@WA$3@WP^+w1B`%4=PNARre8blZOx;=I8r}Ch| zs`e2=QG?%vU%4NB^{er{nwFz^dUZ&S8vUxe@T&S(20H)l!e=|S508m2vmwI-!*5w; zog^V^0>a<*r9Qrci5~JJ_7&;Ec1*9SlzZk^(;W35spGhnvXw~iztb$an^CvDhEuLA zkq9*)2%1c0cL3ct)3A1|9iN)q(atQp^;SdlJ|59~(c4^KtXJEkwW3#9t`!?~uh!ny zD3-k7R4=(t>t;#(%UJ zW^>kCRc54K%iDD%6x?3^!I=lck|vYEWA2kYI~jMy4hW7+nOc|Y?q++)t}H!+C(d$* zah?Y}<&UK@@l3qKE8-q8j~$fVc$%?0vD>j`+}*hqTTL|MTHpi0FgKZOkA{u4QhjH! zev>7E)w?$~-D()xBd#@rEz#sv0WX6SOQhqecsAYOZ=KzWVG?`l zc48~hjIAZy`wU`g3+~1L6jK;m%eaS{@Uf=wR(31?98&GZk>|-H-&W#w{6-dYnS>kT zrw;oQl^P>eG5LsFCKIkY-_Aa#rP(fQlS%hcq6*upC9hc&A-Fu#&P2X}zP0b_uwEy# z=Tm^U3n!+YCNl99pkIQ1r{nG{DQ7zbnk6K;X6NGf@z}Yb-&=8a!o(XpOyb_y?W7Io zO|tQzNfAzMrMyF1F*CG;>IKf;8#BX<%}dN*oVgs@iZv5kLzsVK@7MF`t)bhoTFPW@ zr-9++*zL@%xn^<;7GRuD-yYeDk4R+q#x8Qp%o)35@d*I-q!$*!DJAUHvSO18A?s-xthpmKYr(LZ} zjdrr?)a)>~)1^kkshRe$i<0SjPCK=VAe_v)5Aaw!6AABjO0*r+Zs$K^3u-u~kaN*C zn}Im>3ZqqLDGIdHmXJL6jGEdnvD)c?Fg`?*cK|2G%un!3K?gZtBA!m92&Lj<@g3He zi0_Q=5XHnZiHW%TEYEa^L=vnc#l%Y{emimNVMt^z6T_641e3oP21y=|!8Ay<6R^>Z z^z)F@787QYyCEX`M1d!g;S+_eq|KS^JaIx339%7>kDY8LClxS|dzOmrY#@c6!9SU@ z!&pd{*6XcWvyiH?o)l6p?%;5YS=FvlY@om+5+N|*S)-TxRLxfcohs0cJ38gYN~OHQ&ZE{WRkUh2dF@8(u45m6 zC@}#Qems$O5dFNKC++^RP$M@_huau%aRJV2e@_W2|t=`ne zrD7(BSq8$U7G0-3#D1&1V#%OAWck3A1Z$^Ur{T7Ti$T4U>Gp8=koy$L0awo{W47B- zcR@-04CIax_hW#U#fc4Pn?4a)+WaZx2yx-!of75YOnGWvD_r zpxi*C z;X4d21Dr(8U1j<*hGm2$|A73>ksyb7^G+DgY2P>760>&_-j>MXHrs&PLnd{5_?B-= zb~`1DI8^eddrJP0$}}vYtD`1OTQjz%T&E@o0(m=(BoO%|Sl$9R6Ua?T2fGjwyG0yw zdHBYMkjGgq%eNs?ktQUN^?%^3HDC1Xt6*%&5|0f;extM*?6VZJr`Oc6QEyd^Ob`1k z>o2yN`DSTNTTpTaTZ(3+j-tTSWn+<`4iwUJ;qF6XhE=j!!CFvRvd=bGDz52nV3ecj zwwx(HvBwLS<2{yC3nLv_C$yFVedO$45W#B(gp zBK!p52MA{p3muu1qX;cDme`jpv7?KzR3JsVx*Q9RCAPPqzuGNG6XWdG(5@Kz7$gHx zaqZwEDQRlbn9RsM(%<6lkJ@rxFxf^yS{kwot<2=sVs6!JYt+n`l~7UKd(3#_eP)8V zk*$pT-RNN>?l+t5jc+wO0!{38y0&vGP3)(M{UIAWY-@^2_-S)j>>B&K{h}pl`2}o~EG@!QEXh@j0h2j*iIhS*Ffs&ev(4^oYIX|>D_yY} zf-QTX+$FvB#X=^sKEOkc3>#WLGLbESg#@d>AWzAl_J@F{=EsuhB)k&OBzGrrsJjy= zyF0Wm2M;YXKN2z^jn7~|v{8O54G64L-8M=2=(I`8wB5MH(WK+B z2OBu|0d2-$=LDoJy8|i)8@Z%=%*H2Se#L7I81m0wEwMf6Spux-x?}w``Own+$5<3Q zlsy$}Vl44UZE&qJkq8K5oruX)I~@#2V=yaMRw-8pn`Q`pYw#Ej3`VTh zrgHbsy?xlqigu#nEx+mgzw_*mKQMBN4YTY+?mcpX1-603y6LK!)=ckepfKkoyn_Q> zX%7`KcQwzcGgddp#*vd|7uiz2Kq8{H*PoN7Fa3;W-4-z%{bsMu2 zdLeOvR=AqP=#Z2V0fRw8e1pzp!}2%Nl=Kq&G4WKqwwDz2EObJf6Mri5+ng^)IpIbb zA^>sSoaK&oyl8C;uf_LIX4*q2D$cF;NOa=iwRd#5uoy+QhuIUA;MaDNQ%|;XHidem2fxH!j@mwB&G(t+DpmX34RQ= z-PIhCpu(TlGvXhKFKc^3YX}E)WUifZTAU9_==h^k7v`^=IC1px{RfY}mhJHmU0*o6 z|Aar%iFz%53eNr-9&$f`13QgqQ)2hQwij3$-a~>6Ho?}`-B9ND%IV)XwkL{#$)^}) zZD_Q1kW-_jpVlFnVX|@e!^CzL8EsWMBlHEH(nz4cF-{x{iE!hq_^micnA^Bx#05;s zzVS9j8EkArw_#kHTCk~%r8GK`I(d?}Q|wD2a`Hjo>`hbdN4HXxoME$p4upmiN3#k1 zLzILTbzFPcA-h}sgm$M}Y&VD-Zi-2U5e3xEe5Th%+@IJ&+-_M7%%)0EbW)|4*_IEx zU&OG%;$-Kr(+AlW)#okDNmhqbSt)#nBGor~%(4*p7`(e;vU%MJb{= z^(Jid=WUyzvc5KdzEk24M9!OD{E|Jqa)(I zlbvEr-QjG^249Pxv_ixEAWRtOwo+l{0uA?;BE|8nTkn=%BGoP6v~!`%4Mgp2#fzx} zsWB3rM{9_z1aUv4#P`XO@F-XzEWzsDQE;?cudlTlMddG~=^{d8K)|@$$@o>0DeuA) z+b&5fc`GAsCcYatmDFBQQaCV+1oAkQOp{N?0oIg7D8(*PX<7D{+F9;M1UUjdc)}Wn zJHknVsk5581OnZvBb-ijg;T&_taP$yoG{oK5bvZ1hXppAcAvw_DRIUIG!jlyhsc%T zsYR2WN4GE>3j~%=lZItROP>|XgnHcIT#KxO$*=^e+Zq8yT6;ui(m5j6odwieyQRt7f@4xNrbpSE4H} zR)B;p?qRd{LrdX$UGeJs!}U63JRLduJE9_k**%F}crr0J$C@lwux#j-<(t9b0PUml zzekQ`wt@9|J7)llU3hq?`TTh?(@yfo#>7mVlCbs5#CO?c+WmUs`?x@gscQ0`!`VEr zrA3v6*QzracbCy(hnB|y;e&Q5WT}pp7;J+1l-01861tzzULy!{{8tshR?Kl8ClqD1m~aO97+)C z;+5@RASA`2ud8rvFD`1NdM5ODHKA7H$|RW3K-)?&u{+}KH!x}K)TQaUb6n`by*_v><|&ew*DuRmeakLj;>yrzwm4~Tu8|W$44v3Ux_j%x$2lsW!+UexHPpd z|KNj@dAG%#pRS2ZxB4uN_1L;PCCpHui23zPf})T}O{@Nhiv|Xw6d2~D`H*6z+oFu$ zPF|$KL6loj#Z&ot?!ciyQ9!-+ND~uz&6<6*VRyN()|H0Rv1|eTR=#M+RYY^8<>iBG z7=h%s_n9j7;CN1L2@QoZ#B%|s>{b>LyQM|$LG&&Fb*==`03FKdULoRkvBLSxrq%QE zb$Y>lKkj<4POhWEY4q)t4-z_~*Vj#Jc4w#Un0Et9F3!*wODl^N7k5VfHx}K7hLQ%K{pwvSeb%i!U?h~nC8KAu%NF{I>V}* z8k=)-*YoUxo6fD~6P=zg$yQR8stg+|S9n~hGNRT8it8il^CLY2IeV+@G}Kl%m^dln zP+Fjt_6f1qSz2?Nk6u_88wHms$EKTHTVRR<8O#yMrq|9yw9+1C+b*tnW~CguLbL{R?EpuL6IT@_gmDS_sDs#obSMCrvoLokclQDSh4%p zX;;doE(rx!u68F7;}YQM%9?K^lrzP)8Hx;aA#GU{3V4CBq)Y^NLTwCdrE=OL;?qDTkoZ ztJ8@~;l29kZZSoM`yNx_a;UCzP_Tx>-k$GiM>G ztbzyk=?+hz^Gl0!zY8avdC3&%i-UV*8JW*%^3!-?xe0c_9Wfy(+S$=c{g;?%a{ESi zaAf~BQlt|8r!~uV57|4-oi2r44w*1o*n2v!xgSUsb$2u}lSjvp9)#M`8T3Jcy?1h| z%OV2|&*k#4Ixb7vQL$RCm7ttkSk4$=3h}}V8W+)jEYnUR;yVMQIDzE}snNYUu&zBY zEGhrsHEU=J)=2K}z?=AW{6&9Rnq75LrWgBm0)3mZ=Z$k`(f3D-i}iZM$~t`@E@$dJ z{QW&d4o;>r8Z|mt8n{oYDb&Bd7T-sNj>4>NEURRKt=KN^#Nf9rU;LA{yvt%@GiFN* zn3PO<8?JtOhohrdcvIGb#1dWd%9RRppcX@_-wSFd*_FRu*J|pT6;erE!RuMj^zt<8c9F}_Q2yT9BwDto&|~0?B!zDQbfv*mQ63D z>s14TbHCCWZ(eWoHZ*#>C?aML2X)zXOp1Y35wNsdOG4M;Ur0T3Vg7hw$Z3_Ix$37c zUb%2$|4bo0bM@e%qX$ELG{nccCk2PP-lKlckwTCEK#%`mkN#XR;Mmr^TSh)pl{d0J}!j#dLe!7;=uz)PE77=CyyLH z-j0{s38z*_u2#4~iF3S=Dy=%@!q8g1a-v)qU$2zix>sLnmK%161|p6Q<~UXuk}2n4 zfDQ$S5w(#=-A^)6?P1+KuN4orN3i@T0WUXmLhpede{cNZp71kO!s`tA0=Y; z+Ej3`WdjRgV7#45OMna zK*X8CK*a31o`_Kjy)f5lB7tXnQdQ+MR|X<3K0gp~>GWX4ivtmt2b+E6@<5Jf2XoAS zNyM3fN9G4>S(qEh@nY}bjF!A^Pq*tP9`6p^>d3(@$`#R zfn@Tx2O&Gpr!4#Uql?SM)91qH$-Q1IT<(V4A`=mi1!*qtpLIg^v9R3S;!3^S%+bYK z@${K6qXM0&8eOaxXQFvipp!CQTP)6X=j@dC+86;F2u`w+>S zkX}T?<4bOFrki}w9}Orq=*oB*a_^y1UlG&YnL6m-JCNh(DYj84&6SeP+t)BXd|{!d zrKA3edI>Mj%=ro|Jg>mQ^M0=Et`x6FV>rIz7SDIPc!;9C;!KzD=~UTUEMC174Q2Ue z@!It;Fkap)p6ik@17=|Ai#^R4=N*?bU0PBOr#Ri)P(_>`%rVntMTU(Wmo7wADsa80 z29&N!&y>`v#kos8$>T)y6+dcj7B4>+^~U(c(_KO06lc3FIpU8yPFmaq6AC_2O)ogAX(MbuA7d%Q@Zv%Mmf%olg}FM|YnO zB4+yNi5xRulB2hbQRV1x2!S($*=J`ujSp%#*T)b%a=yR6Uh#6bzriDO7Y53>+AC?) z4+L^|N^L}MD{VxVa)UzWpBs3jZ(Y?R*9RYYuD6zn0fy1Uw+4s2)h|*QuDc>XCEHH~XI)T`3j2JiFo)FLbH)gg?GwW#onVnF|;8pP7Bm&#lzR(iztkM0}5! zX4rXO>wHx6_)4pIzALqqx>=m=aBmQpzIIuq7f<+^N+}wSN=c&~4o3woqHn>gnBs-r z1#h&n-0j0?WleG~dbZiWyp30y1G7|VDf`^@x#^iJm$@1>TG`MTg!8gmDn4^n3m{vi zY!J|f!{4=5DxRC2IyZae+PMqUbNi=frq9e?e$n4P5Px;v&#kQ$FBYbPJ%>NO#!}E7 zVua?}dhudJh@)%03ddT#c=4JlXG@b?tFLtjesrxzv)a`YIK><5rCMp3;~J`J6&Jd^ z`#2FB1CzhDS-cnt?9u9?=r!p0M0L4%y+<}5@JFi^5qvl<1UmGZt5#OKbUjgR7BBV4 zrNjPswO+h5J$3o|rP)iU099d)FuUaZr)zNKeyxi?7tH%0f@p44pJ8JAF(4Opwg$ip0C57xtcWA6ridOv!?M#@k^JsisTv6M zE@PpPHk!q&-PzG2&En}UKPbXh*)3zV!Mc7nY|*$|FJ9}86w=FWb$gN{fHG`1rPuxO zASo(|5py?+*ZNcwuczlZuY_ERIy>r>yX-USA>5*rT|I$b&Q_+*$c=KNgBcANbGrv0 zgnCOzbK^wKbmb=lygnYF+U8)y&EkB2({J`E85F;v&P5H|C@w@ioAZ22tU=PYrX`I9 zyT~GF33kSRwAr)V=9})qj zn`^~|NN9~Wty&ZjGP1hauYofGO?O~fA);q9!#dL(9K2>zoU<^^7h?9$ym-yOD~JeY zrgEd{R4YsVXluEA()w%%3EbEs5sf}OQvl+Y`9T7L0*G~%Ot zcY}>YFyPsnmEv=AQwuZC&H1^&|D08E{PB%azgCyqC^=FXf(HqqiABRWx&f_5tU7*c zrJp`>n-w+Fwu}X56FD5Mw7JceqrFvFXt3j6UOaU8;2}R7Y`GUJ%ZxOBvdO=)=9N7^ zM+7^jbEj?AktlSLoUOjv_dbG6xR59vE)10p7fZgMwP*@k9Cl3%W@gnQ#|==Eyi0hO zihc?2I$mzYHwzhE-mGwLM?|gY@VZJ#Pq@WWDL{@ziz^lx-y&z(qKY1Ji#uC4XJmEz(Pi zX?0?eu401%rDa7@moXVF(q@ni)r)0C+O+gyeT@&ov}E&__h&v?Z6_8PP|QV3SV(0g z;-SPMUBX1PSSpMxwyM(Qn1HlwM11|@Q!Sh4x=#atoB^T#aen22mNjZtc)Ss3Q9uf)v{Jlrwia}NGU zd4=0Sp0nTUda>%tIMgZ?GMLJ-Z1X^(OfRqrMTk+8L8wtB_GZy-k%2kI5VX9AmzgU2 zG*ieaukczF?ZhZ#*0>8?s#QEF4D79u0?lE}DK#xx3_?7jNaOgtJyon$!nu^c#Rrm| zR?{O(S~ed|i)rx&y+3AAXTXTQSzNyf@{5abghSDeQw$K_5+H`gW2jNXLCdb6wdj<6 z@#51=4Dq#M38D~cS)>LMT7>XH8h(&j<55sGY$tw(K`AS17FB|$)K(&EL5VenhfssQ zg1jKI6+F=Ltg)o!*~VDM=7OJ<8RE5Q!`AC>1ofsl;8w-lSy|?S(@KFxSx>RG=HK1% z*SOkf_VWfWFCY2$zHams2Pr*IBPg7@Ka71P;3=#rgtMTQ*NwV$i)>H{_5q0%&>~U- zRMt3y!cdS_)_8hF6GZBKhEVwUGQ>b=MZ@J4*Kb)=t60>~2=Eanji|om6d+9@Ur%DT zL9L(>tswHIQ^;`lt6sBYj1(NgJOLFX9JQbo)Y%fpCYC50(?i9@Vju)9RosdU5X3JP zJ=kE0R$yKLrDbzq@`kxyXDK?dL|?EpEY;fyu^a{iQ42_9BE(FC!nA6urT1j`YE$iJ zzMosu6zDouaD=h|!?9#Sm!P)=5#-V9-sER}gsF$HHi(NrwQ3=;Ol6oHAi4B1hT`RV zAp@>pFQ)m+2nwtX5J{R#sCrD8FYx)}0q)i|7DRC4O6i-*=p(U03_~q5t(Y=+b&Jnd zI1Yr1X+i>TnQ6c4?#qkeP%$i6r_0OX}Dd)QVC4+fP#^dF^sCJ-xzXagh}%~uV%*G$(dbc?-V zx#W*oG*xTWO5BK4Cy+l_HY!zW5em34u}a@CYpgc>5sPGP@Nd}|&ibZ5(I4IL24h^< z6C=u+PhpS{78Fquc9S(0iZzBCtBGcQ4R*q2vgZ0D7TIQS?zl#(&LLd~vdsqArX|)? zvXlqfCe*XZ3dIyQ6u#D&klupz1PV>8AtkVztRa4}n6SJIVJm4VRI%&}f~(RpiZD4@ z?xC)iKQBC!<<2pi5hE1t$wPu$(?;vfFX<; zMBQysNB*1&v@3ttKy>t!zGu1Ni0~+oPGa|9aZFb9<0NR$w@G^xZN+O|P%oib&4(GPQv|+c!R~FQMm+8TzA%r1=4yI+o zP)9LdK;{XL4q}xMCt38RoJ2GuGK95);oZh9sl|F%S@c$TZUvP$n$AN^rw7;YzzVY5 zAG4^FYNI{6O!OwyBnt+MX2OHov0qdfdRZ=*tzo_ov4RRqnrdGwN{93qaZDG|O+h@A z_Nw)pr8RPc9hQ@kz@yF&K^)pIfi(M|HKq{+CdO1qVurgt-TKCY=x{r9h{3hl!thc5p8jz6!3Tnbfg3U1bhU)~r1aTNg#K=Z zpr%fk!O;|WFdw6$!EIVTlwRiDl+q*w6AWQXv7^3GZ2AoKhGR6;X&F-Bn?w^r!EOTi z$$V0&O`-2sDp*9ifde)Nl#yss9(EPYO%u6|Ri(L#7ly=u(p<52l;+A*aId8ks(4sc z+9@vj(JE{!+B*xe`H?-v2G@$sbxLBUv7?B!HK$lmBwL!w&-5Zx(&?uD{KOPlZ;J!Z6=~U9j8#)~0S+EzKYA4IMmqu#nhb#;~>^@YAxfXm=*-iZ~3riZth2 zObAvLRk=x(*i)pZV@N?kOv{AAUMb;|2|Gxc##m&nCB94}rjwPm(3WB! z@s@2iZ+U8Yks%~obHm0oH}s&r{1AAX8`Oi8#K=NpWF;v~Ly@vWqTE86XRi?}i#W(F z&XWkb@T^6%=PbJPqD5y47F`aqEX>)^mCF{rIBU^-kn@=DHZ+LYgs{InNW| z1u9gKCqU;fS~O2qLYJ?ES?O5vy1QV}9Ni&wA;_t5C-h8!W`YM!2U!+q4QT}$4!X(^={edD zx=jD=88e$6o$LmCG3Bu*zaSm&TBJ4+QuRX0qH|n}F3*5;Qfv1y8e4nZM^ANI#UedG zXqv`=^qkNIs@D||9?Tu4Wx50kdECjzq!mF-LYq9D3*1|h|=vTn?)ijd)Nii z%_)$Mt*n}*S+K`PC@ngSVZgDD6KRiktR{0>A)W1jWI0zSxsJo63eR$vRro6NVNY;C z>vkUP84XJY4LN&3cvY2JJWpnOjABt33Nm?NW{$~i<`Pzaa@mTt{?1<|#9aV-Xb(>4 zjI7^Q>{~IRBNNhePy!X`CW%FtU$97XL*xv70$t@f&>6-8^c)o_EeNSYgrbkn9W z&O}}h9~YVHCW=M#@EW1>j5cU4sQqe?Q!HnXCqO#Ku*i0JlP*z=J!)WOTlcv|M=o%DXIQpLJC7x_tZPJS1mU z&V4HMK2`K?1ru_TIQA=Hm6U=hJ)2UiQfgI7nR&e?R=K0p`>dmcA^FmBzD|xK=Pv80 zfD!pdtWQOa=!p>(HKGoVsDmSF%gDoW_R3KQN7TU)b#O%88aX59JkB1KcS4SlGb$%% z9o3Oj9XZvJQyn?gv8dGNrSAe77`{X+>rz~eu&fRi$Sw~sU%C}}61=lnryg41K z+#}~+IZr$+N5k}lhUp0#r_4_%^Ano9Cp6AaXfCfP^*$xsr{I0ccb`(nLAVk7ZR+RuyISSXQNERY&$=IeX>olXF1M5jiL1JSj({l075myqrsNuF6@! znN~$_w2o>k$hTKcQNauHossj5oCoAQtAuCedy|~ga^557K{-=$^43wl8Tn@9dsMz_ zay}^Mh@AJ!xg}>+&QY9lEc~Z8pY)k5`|`-=cw?r*m)5spOT0U75-;mRpuE?vudSQp z+jwtAuZQq?FWy%->7Bd?g}?LOJF$F&r*Xz)?B~JwGUQgWaV-j|6mnz-pTBj9?-=n? z74Ng3;{Ey5?IB*YN*TVlNdBZgMjE_T&$Bs7|3p-t*+%J~i9#yCclQ5N`+hiTkH&-c{d5#o`(BCP_#kio@8tEJyZxQ{1uXX6KiFbl zChNQ-m4pVM3qC!>i!xAl?ADZ8sjnI^GkMw)e8hs6i|qFb^g(atLvK7j8M~3A7Japd zZ`nV@vxOwDY4Xz6@N%`j$RCAiql`K09^dNEhA+nPmk8SNwRZgGz{@&(AFIMq3U&(n z$}HKQg+hb(^Y|v?MBIOb;|bnl58pPPdeXkx=RGww_?&$Q)ISowmDqVFj<*W?U#i#Ar z2YLXFrt+ z-cPn~w0$FW*mv`J4e*Qj?IV1W)&75mm-IQzD;JCIw<({GQ`pWB@tHY36FX%qhm#U6 zpH(5Pozb^Wpg}MANaA-ZZp3~ot6ql%XuPJs| zU!bV)KCYyV{lKIBX0ki3AZu{UeyXxPWWT;?KlK=V`SGTb^j@#~vYZdgu^;)-cLlm{ zwf4~3$4F>rEi-!h*oJ+1usu9;<;?8->_U5F4ob6MIdH#PIny3CWyb^*`ztE+SLNt? zUX;@LN`m_l#eTaS(TM#Jv}i+g%jjCl@4ixNeW(&lkN!FU=M_(BsJ!2Xe51d;AqwO( zT^W6~Korb}xYC()f{)RTLE8hrL}vGn5q;YLNTyP$#E!AdMD9(Q(QGoeEw?-OU~YdV zMNCRAHQbXK&CF*W$n4A=&F#o-&t=CFV`)Bp!&fnPjN~5tGJmWl`DN00h4Rb&GU;9P zWQX_V^8CNF|9?hcfSx+@7{%-3;jjM-+WY!x{jt40>reSVF{IY^wo9SGxZdu(67e; literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/operator.cpython-36.pyc b/venv/lib/python3.6/__pycache__/operator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..301472501930a1b5ebf30865161779c69d30f937 GIT binary patch literal 13945 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 Vc0@%QrYe*mh8Y3cv~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/os.cpython-36.pyc b/venv/lib/python3.6/__pycache__/os.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfc41345154be08c7e6d0ba0fa9424129691aad1 GIT binary patch literal 29646 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 YkEDxf{2m&~6nBnXk2|*zd%5)g2J64~E&u=k literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/posixpath.cpython-36.pyc b/venv/lib/python3.6/__pycache__/posixpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81551157365166852a3b60434a27e0328427f259 GIT binary patch literal 10428 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/random.cpython-36.pyc b/venv/lib/python3.6/__pycache__/random.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..190d5b893643db20d5712959a243632be1107ee0 GIT binary patch literal 19224 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/site.cpython-36.pyc b/venv/lib/python3.6/__pycache__/site.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c2231fbcdfbd6a340d7d2e4599125985bdf90c1 GIT binary patch literal 20709 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

!jrTHfSC*UE0bstwIRqtgQ&N=t*BR+>ujlD zvAcYqV=UbNzxXM6m2pb2UFdXSnW;XBO4+(NpHNPHltsIUPLd!yMTVh|$0TNZ~e`#f42dXgy;=dou;ZCyrbx?dT*aCpIY(i6dTYx7!y>*u%at>>f6ssr2x zg*Ehx3jRcO#^DQ$6Xm%+HP6zSUtVj>}Nq~)ON0)!zsuD z@{1ccC7(n7E+{#kpf4;dfI8)(5zLU=aj-M_?LxoMcR-VF%G_Q*k3Kh}QLLlLJSdd2 zI@T|k5$?d^r|f=qb)4&d$LeSF4-|KoJT>2IpHm83)(Y+!Ne6Pw5Ebzkx3H7z;BVYW z3MJSE5xHiFtTVL3BnpF^vq1}}(hxTczctitpkplP5`ZbkE_U?W5A0_vIU~iCCS(Wp z9}Kq*BUzlkdR=x~kE3_&a?UuXLy**tU`3o03=0k7@C+F|$<~`tT1q2vK3Q7q$|*a+ zVY1L=A@LNJy3MAPJ}rY&k^1on<>3S-()!;(^N?6$WeOmhImZPeIf70(JU#qlN;XtL z=`@gR%JFO$|MVN^RVO*+PY%E2lY(sDKt@EQ1lhJ>@ZEL<*_;SWTo{v;GNzA`;NtkA z+_r#zAhFDE(;R$|=(oya`>A0B?7KuN+uA(YcY%ifb{6O{f|j0g523GaMx#JCl7bA7 zu!$q?=&u85K&pW>+1_m;%}fH(8Na5Np*OXt^zCvspul<~1ltDzfbIjuRl&$9T9+6# zK)wZK(qV=$qmqF_Rw^2NAhR2y2eP+96!J|_THs@x4JhlzZV2;IT!2YcWV{McA_{|! zfVz~^uW=miyZ#uG%4o8DvXDxa+aKz)tldXIxZg?BKSXu-9FpDrCZi-783zH*A@AWi zX?FM$+U+4H- zU>gJmgxX!rs$*-pa3RWRm9z)p0Wrxe+uPX>oz_cHUiZ@)2#iVjVd=M3aigC`l>I@BcvFihNU3>ah=i-xq=FYk8>~ zL;Bk!l4_b{*0x$6-ZE^BQ}rCaZ31Lf>XTWsY8noX$FV-ZzvVI06eX|u1zksT3STho0vT~$$V2K$Ls zWEJoN`}CjH6Mc6r#~j)nSe;T&f~MsAd6o=~nO8^EQ^PxtvB1tiTb>sdcWk>L^E^g& zguXwDrop@{!t6t5<3|uIPJ=y-fT}#*`zWajk6LQ)^-q#?!0Z$@7NN45I#K3I!?dQ7 z6)RJmYlo+T^-VB_Mp%a;n7P(i?2YXiG0v%)h8d^#T)POMeQUD|}Aj&UJ~#yMjVe_+q|gp@!Uq{E^&ipn{))uN6RXYq3S)j9=4 z{*c~Ne7=R>@Gz2P2v6@#LijZ*GDNViIvegSLxf71U0xU$bO1vLq!?&JPWh$S?(8E} z54^Lahv3$o*Z(`m=VUpn_iRGHQXBeN0ao~WdAGe`$61kPdm~a$VY@fB#~K^kr+TBN z#C+vtv)33sS66c^`20E&E5Y*d?tFWqv@%XucCM&{2oQJaB z(Ct>7K_flSVMwJ*Bf=M8AlSl$;v$GghkPTIf+-B3)tX$Tkg$ZXG9p`C1s|%oEAS#2 zKC_RBOzhi)KgF!!T_lz>1+FpejDu&4+Xs~+q#CC>zsb@lPYx`ltfTz z#i(#Jg2b_!F-8S_l!gP;iFm6oN)B8FInWI#e(q{+#{vhtsB%fWJZhWL4z6M3+||6a zgY@6~2;L@ulZ^)-57;Iq+k*i$p7*u=xyk{I?OInVc0>9+zgU0aI+BQA9o=zjBax^7Kt>;pMj#>mK~$tNMh+H{+dG@*)fA-YGu!DJpaAY4>A;RF z@=6x+2-UssMMcQhGRnsH5*7Nf+6;g}CRh{qQ+f;r{BW4(8Qi;6gE3j!(eXtG7YsnY z;Y34+N8BfS_#llZI3R*cq*}X;6Rdvw)}@=(^XG0|qJ^7BNw;A}2bB|d=a!r>D)xrL zr=EMWEa`mf>g}|%`ILb}e(y@sG57U_Mb)RB9L_g%HwR1AqFPxNT^Yae?(Hkr7dRD{ zxsZ}Gz)w=JH$v~ceH zwM*4>BZrt}PMBo{de+_QB5jMS9NT5KBH}?69FgpBgfJ1pG(<#%emwRFfPI7jeHBAl zW8+RCPels0NHDqr*kS>yHS;XZfuwj~Ysni}9ITWY{Zb4Vh*?5lZlWf^0I11AWHPk* zLe$M1frSgU8c}Rj{)nYd!?p`6ItADk#8jx^g|n7&;k|%pX8PbAY^yX8*Dlr|L)?(1wPCYd`@FT4Ypd3<`r);0MG1F1Q8E!_k(YGfwZtYu6CVKtjLH za0LKQ&RrSh#?76MR+7_a!XVN@L+brieTUg6b`cSWrO9>1C5{zoNQW9 z8E%4ewgkhbl3|i~pCrJ<7--;kdK-<;UwZTE!nLdCZ=Ab*#SDQ@GUJF-U0#gsM}|sb zWgfApgw*IO*rGjhbEP;u$piZ}F&ZuC7tl}=mk< z;W`LLpmmN`-)N5R=$VafBZAchm@)&aS2UCEJa&g$5MsZmF2Oq1S|;@-&NTp$8hngC z?4S{12>g}yJrQd#Lb4GL>@&UWg>^Oe^AGG#^`D&Y*3#cRkI0hbmS*p;lx@-X!dV*~hEP)Zo0 z0`27I@dht!Y9r&J=C9~Z+r`&xj&rw3!a~|1VOF(PtuI-0cVHFHLhm3C$cgY|iH6Y=a^AQ@rDS!s-b6Qg zT7!1t&Jucvm1*cT)#@+*lq)l>7xn;$7Ha_xJq|Dgicm!}AB+>lVUq;BTcBp2!{!*! zxkmfS(wNrLXV5$LjB*rTGhgIlM9Ku?C^~uv z&0?46Mayv`!lZ_L&?5q?foO|yK~5MBnErsnejW*?VBbB{nVAx-`7~#mL=!7(SQ2c& z&h(gP>o1|~p|kM@3PS>T_iR+4T~*vA3;*D{#p#eUp>jAepc1NpXP$OAJPT?R8&(9o zZs1_!Z1iB2$D?Mn5-2VVNJw;FVG$j+qpAb)46aZIGXhfq%RmSN-oa%Mbw{p2Z;iNo z+u8&Zu|vHL)w{905;1}Toy+$rE7Y?{_`@d;(FOd5$B~!=36b2Y+VGlMRR`uptC~?D zaaDJKZP|Eyuzs`e!|#;u;MPyR&p3CX#_twDt_X)4NYGO$D=2D&9G7EMvSMQfp+Wn7 zNGrJX%@kh+R|Q`W45oSb=<{1s1N}GotvLAF<2Nb#j#uz*LkalBZD;c)@(%J>;2VO( z0benc6eu>CEg#9mdaH$Hzpq`lGZ{U<}9EZ7n1jhQ6!D-z%4iDRLs0X$_c*EK_ z$Xxh2jPKDDzdFk33BcBZGJ*9-eoWw;SG=!9i8n5(7@r>7|ec4jLk#elc;7 z#7DlEu86@G(=kIA(dO@L&2B!A?}u-XUkq0c@opnWO#y=uFCj3`E%aWx0uN#0GN!qP@r|=&n;S+5HdSKhCFMTj8zUufdIK!! zH}U=Y>qubE_zgVZ%d0Wm`fHLGx@R^7;pHmW6!TwYMAz;?1n6|5cw_;XYK($eDM=8z z0s|k(Xq+RWx7xAYh%;-!*8bfi7y2%DkIa_4M`Wgv?I8Y*gY6KF>Hag`^-|{ zIN$=-|5=Qn{|b}OA&GHTRJ)Gt=eHQf$1mK+{q`^D%V_d-E{IYq)Fu2I&lesq~{Du=4m7B>D_85u_Npk#`XEQgtF1b~6)1#P@9L7`#iTqy#Q)DJjYu?0$Tsy#$`a z{Hh1U;8@^U7;W?*WLh<{>_|O`6P{!6bMZO8oY`^FcOsE-XKx`|U?$}?iCkMpXd28J zGqh7ws|ja@R4|e@jPpsG-p_qp%+V$k4-5~Xl~8VAUgP;q>JYRQG~r1GdpmjW-o3I3 z2`jhta;e;V?Z(y(u`n`_d~bKD+3kGBUx}j5nR$dQcedDjzV}V?&)aZsu8FvJ;m*}r z|H8ser00X{a9x*S-kbF+nA^Y5*3c16U^k`r8tfawgR#RgY;ZWlWwr#u@%ly0kM2R@;uQ~KOiI>yBKdoP>!Tq^NeJ0O?~3pvjsSIn zC^0PTu~?|3)Ek-4w2~=ni)~zAFvVqo>QCT8|AT;aFf&Y9lgXDq%zn7E41Vc%5wjXh zDOOYB5LO|K^qsGmbqkq>9+njd#Mswn2c|Y*ferMH-L-ov)PEP*ecLUf{r}=(I2VcP z@Nx$9GPjRj>c7pA_NoT^2mThC{5K9PN`VVx$!M0<@tgh-0?(Mm(UDAh zgYMr({m=~5MU4J20(9l)2Ks;Rf>eJ8_31?XG8!#pBElrK8btK6G@WgszDG&)&?Dn5K{zwaSomsK7SOcT zyjR=8X}F7kWI8K&A?Wz}Vm&-gLLSgsE&4r-2X7%NR!#ysufy6U%|WzryR0TrBM`!N zyM|qK6?z$z<18GwubdJ@GeIL2r{0NO&V!&4F=+k*KnosDTS5@$sJhlo44*QeXlhI} z5t_Bvx}A9RnmmnEFp|Om`c}6kF;Q_2+Adrlh#ux5gAjQA4>6JcM@T9e^w9s9uYwUn zXd$h+y8lD8ph?<-Yi<&<0VM=RpGhR}KS6nlC}_E>T|I#pNO_R>U|`DVgG3r*rBsaK z%JjZQCQ2e@Y(D7*8q0aY3UMopfMC#gGawr=971e{vJ(kxNY7?!VZG6q!OaTL5xC^G z+Fb@&(oiV+B-~+}!1D%&nPn|a^@gy46)qDc8XuK5w4L+2Z_sj1!M!H%>1Wj>Mw~<+2O&T#JCK9`9mD8TCZy*> zd*j$0%-A}}w(5Y~(EY;Dynx8i+Z5o#h|m8zREC?%==&H}B;N{ci-A`ly}N51YW?`b zt+y#Eb9D&3LTHQ?O#=e|Qy`E*8NL?|POcdB2tt~Q9*+tN>)pw$9^5Vfv8ja}LdX#! ztOt77>g0C8Ao$SS53N*9_6vZIy9YjwZtcQn^P|yW#<&BrvqO+Q1elH_tA?o>GjB>C zl#7Iic=TU+!g3sPYNbE64-6N&y}K2`cIF zx@i)$bANH5<4g%KS$~21}vt;%?&J|0JYw#V5J8V7&EtCt3P;B zijiY{&YZaoJ#aZ9Ug%$97X4i&e~e@}fXH|?Gn$@?N>K;A%XBwj*h-u;HrIV5OW#Dx z28k497RIyoUPkat1e+{$Xt~l^rM`sF>f~~6YP#PIECS)@ei*}vV?uxb2n8sY9s3u| zKcQ)Z8d4i5fazV`;jiNr4jqa06*e-;Sg0gW#~7_d1EKN}7l*GWX+mCCm{1@vfkVfc zdy&bzOc(+I!}B^X^zs6}{v-=rT1OdF3nwb3^cn?3^mQb z&}uqcSb_LgD1jgr2zme_){`KP11ORMvB0*Y2c#%cNjCJ zh?Hzoe4#LGZdA~2%TRV@|0+c@2Nx3cFQOJQHoHs6nvw1Q6-#Xs%Dqq2J~TKi`{M0B zH=tv*JL`Xs0rsFTQCQHIRDxH+@XHHf#;A`AVRHGy37-ebI&x+46tpn8BnETpBt)(> zPZW;e01@|_T&jUqW-i?AoKy0L2t-ad*OC16_TnyD0&&enF{u2;dR3-ZKQtILs10E; z!e6s6*OCQO7=YmqAs8r58n1(kXU0jaDRFADy9HQ0MOBgw7qk${_-{}L#v#SH2X`IpA}lq4_kTcH3U6*drxbYqf6M9&E%ARkS)EN&sayXu zObz7u0UrCYTx9e;t$&@Lv`0q&Q}jze1+}}F{O5QXU^3-zIQMzCP-0FXdB4t!8AvmO z8*t|C8*XW`POf7_Bl=1tvb(ezm9!}7STqiKA12rxyGXB*9d=ZUS%D#V0WU`S3Sa{lDV^bJ;CI6PW_St)~)t)nSVs1~E7lpRVCJgxZ3Huk2l%5t& zqJ0+3F!7i$R%sVCD+MAp9ZPbx%@`YrQHGoElNCCwSYc9QqM7ix8~)#A?n_K)A{5Jv zrq(Umr08Fo8*Bn3xy%y&0FrQJ@SG|bM`ilWYuC@8yH;hCRQ1NW3!gamCVV~nsE|u8 z@eSh68H`~eP?!HEg(K6k<>PoTD3=#T$f$%XmS*gy)h~IJt>jd`Ytq_aYzKX zkqm);8{9W>(wZS%OVB+7g7d{haLpaDKQ?RQ2jLO4qixD z%fY*i@B%x|%!v?|XBn8m8Sv5bk0*$Md1&!;qb09g{TXTR`!D%(GzdK^wt6_W*!N%l z@eL72L`$9cS2$KO^eNLLd_>sxa1VGjF#S+JLLQ5ydHaz;)Bfu+va!GU5UlZ+RoF+U zPOq5Cav$?Q*~_!ygr0q1zqd!&Aek2R>o77z3;rJcLcb(p$s?pDOW10|rg6Q<#RJ!A5uwMV5 zr=mjQM@a#MFiT+(CQ*cXk|5$2gp)y_=8hfiG9Z?xfIAQRhZw(ts3B25tIZ5v`Qu`9 z7D}%ghk%GS@-2{(Q~#kc;8O-L*Nne`Tm=zhQK*R}Mli0juyEt%rOQ{}0dW`j2&4pN z5;8BE<5Bjw!$g!z>Y%Y3A&5Xf$wG>@L#(aL*HcX1U~-9x@F?L{!l-uH(-&C#WhTO? zzQx>knC#t}OL;Z@K6eo&MueB6-DtO$?{sZWvy+Il>;__ zUbL!V^;InlIfXc-R}=9Zf>xbnP+>6McsA0q?hvA77aJ;wR;&*I=rm6 z3-3;T!QIUd@rQ0{-tJS{26MakVV=LGxqJ9U{xE;!7IVA#qx=XcJ&@na`@1x^j}Lf# zCp13LtGRpmAV10<>(Y8Occ0hi?Vs2A;KZ$w=_*498yzk}D@MC!A_*eN5 z-uLn2`~=r+><)qN5%?bh-zV^Q1pbV`PYL{xz^4TMlE8lw z_$vZ`P2g_`{1buV0f65oVEr$E4KRmJ$v+)1fd_n=-w#mILhZ_-It$q;?aKbwv_N}R zn`a#QaLXau2HRk_wcjvS)2k-tOW!7mq&!ZN_5wgoXC1sDD;q)&*>f7xR&}nS7Mpw* zRU^HBFk(wIl_l{2YJ4^_aNhTXKTure#kCUmYt;entqrU!)`Hr6rFMN_&8w~rR7zI| zR&E4~wd&*jPYz&73UjsPl~Tp)U%ByFa%jP;dh09V#Bu5fjnC9>b`9~;TtI9m`kM@B z*b1(#RJ^<{9t2;+0@;l`6A$5290vF-)vDPPXfyFB%I0Xe^w)=nCUF#xFKin6l2$hY zRyPB^ZUsi&4$OKYub?OHMv$#ZrbYyY0@|CE4`QX zdaB+Qrb4T1Z!*!VBmuL7wxx8~7U~;%Jsl>+PeZ`6jkgiBZ!o5XW{730w}%GD;^8|L zWXg{C0OcL@y?!W6&$BQYru(qLuS*9bH8Uj5{P2HGx3lk&p$UW_wrAJVE_ zDCrDSeP{*JjWA8`Y8F^3rnJ#}bqX!-E<5P+t!D2}Z>y_A)pTy$V)c${x=|l9(Xn$3 zK^Kh}?RSL94XZK6R-a^Bdt_Vhqpj{?4Xu6`ZS}~$Il%Tb`V`ujQC<8He7%zIPSD5A zFg4G*F`}1Q^*@5WAw~e6X^dcBIT>U7rTm{k);&$B2MF8QTa2WQv*!G?aZBOBy%<3o zxBE1#oF!T*5li4kVG)vIy4ORl>d%Wka6u9I5W*@4qUjwrini={8B!>t}! zk6H^8SOG(vY^=DXIg)m#LHpdC${FRXY@ue@(CzBOm`}{^(t{fsc1*h7h279qHo)^1 zRy9HE35ilewN*lJ!f-c}U8+)s&+LhoN((7!LAF=sWaG z$1a!F0o04ZBQ0w6An33apx*>0tp(x1qb(lDZSA!qXv-3Z8f`6T^*!MpSf=iESIrXk z`XpNW^0D;G)$UeYYUN`)vO}jf&DHl>R$~1?xCipP(Wc_tBkjeWA#KxIOl= z`d)#?=Zhnl06`v@n;f5v#Yb(E=Vlvyj_k>?Gb6KOQ6e5hlsG*yK5>3}%uSw~YShrj zCo!zpAu7x*7KQHxt}!xsX-hv(otqt*m~a!I7Jx*%n%$cnJ3BQ&jaZ%#H4!BWehEwF zMYfu$D0Oz^VmxbZO3@1ECdb^&S@gQ~9XX9YM2UDt-6T~#KRG)-0TkR4jZ!n`Pfm@@ zVp%3#^X$m5_&)pkux=Y*?|%toEf9-civ0SV)1GCeX|XnsWo^w>>;q!z(V0c}jb zeR6taa`ai({QCK`Q;{=@0iHQGeJM(gJ{z+~DWEaC>ztWBcYbPm?6lj_zzSm*$7g0| z@_msxSL0rkh!s%`V8tTSTP_8zS%8kY?b}q$?bxAVZu>R`!yvZm7ws_5kM!C~q!-sB zy;6%zzg$|0SXm5GOV)y@U0aEgMa~Oyk48!ERbrH()?z6#gJP-TrU)wKcM~MzhUdFB zAy7Q>wp$xpd>x;|c>I3ai@MFs=D)*Ij2>GzSts5pmd3xs91RctyYSF=r=Dghoj4Uw z#&95mxUzA*l&;FMr~?eVR7%pavi{cZtmIIVY?Nm8Zbt9!Sia)TKnihEKcozWOR4CQ z{G$G*SOzueO}r)~WvFfR80~|*8}AhBm8Ha^z6r~qmuN-Fmt&Ew0qdf1>D{`VyEzNf zMt=?-6OW7peg-7eao$?%{}zz#H9~X4z?t}u@J#G_BD6wVo~L%8!yoTo?F#L{05*&g zcq;J3h+>ux&))7FC^ zze`Z?2;*2=2};YQn+WWb{SsdTT?|v9g`Iq6EK18)!{{YOpBsBp}NNiOcVGjfgu8PG>X#%Mga0olxQ?Zn_A2gpiL((5O|KjMFN)y?ASrH;Qx%r zr@)YQ5b2P^bg5Zc=pHlJK+G4L+NJ#|#jFBZjj! z*?JHnM%!dpmXsEO^36?lLxYAetm}HnL^Wij0d*AP+aq0>ik zUb>!?9LXVV_3{O+s`wM|JwAXm(#ih|4Ct5v4_Rs&*Wt4x4n-Sp2PRrc#a};03qM|; z3{#NWUvHCA+t4mNS+x1lI-*tb*LJjd2VUSuXt#U)gshov)m;5|&<`uEm(i}VWQTT` znAd4vR5PKu^&7mirWPd1De#62i3X+xPH1f)eO1;$doDz>id$XUQ`n8y4}}c0B{fFE zf@Iy^F7c99)h}vO+Ug!-ss=I#Vm zJVTPg3_M94Bh$rWA!Y{FB@@p~xBS+_4BFFswRt_3sIR8UHxEtBfPwMreic11HW(m0 zVT?i-A~a^;oz85XJ6*g3`+%853{EYj!ww~}DGPOicFAFtw0bty)LodZ&OqBh?7lu9 z7~J5nThjVHhlsE?sZ5Ng9)u4$Fgq`M=Zz_jgb#fi! z=tT6t8}E)yef94zXy_;M8R%!{0)x#$t^&R`tQ0q1(NTwb-|l13~wUgh5U7&%em z39t!|c+Giuwo$6ETrONK1yqB)>Bu6ve$-Kr??O<6^Tgp3E}}5sB`BlVvP7;?yB3J6 zpt;guk(8EQa*6jcK*WShW4We)2OhCi@d8mzUJQznMGm4LB~W*zR9$ebt8m}Tt~IxK ztyPg0t`S+|6OdVH78 zV!5PpH3ua;dKXLDGPf|W8XevA_MZlz#9aVGi+m?SwO3&HUejOIUS+T9^9HBHloRNI zaT`X6o42(#q&O%eih#bNuDaC>cPBeTvMYwgR@jqIRCvx)GSU5!|A=U(v9*E)@iv`d4IX4zgQh}s+*jjK5}ax_Am z-N;D67Q%kBI+j1wO|X>p+Cj47Ra1v~sU1^%blTE`(;SvH4?l`5P|G$!HO>-Y0szx5 zoe{a|i$vYwmYf0Y7IoJIqQO}fL}_-FsPxEXSOdZtOs8CmE(~-1YJhaC`rgoS08OdR z)4>9>ZQ$63YXNf&)l&ZMoSw_XHFtLiI27fXr(QS}dnLpC#5#0rO z#ks{C%(=G?xJBMEDe6eBG~XD&^Q9}fTf)Dn24{K(N`rALllX-M=XuauN)G&^{#tYpi*FI5WK zBu^*W=&%E}>W6E|DOcx*QR3@6^eXBp&@BtCQz0HfLDqPUbd8)?Et$c#Ps2bfH#keW z_v@fHb*~*CWP7FVeGCLH7Hwy(jyodg)|;@!xcazq8=JoNpKBiS^e2+_Wl`E^9Vdunl6G z*5e@LwN{YU4sP%PdXw?P8X9#I=}}t4?}sK<%u;I>I=F&B*eiq0k3(l0H$q>*vEp!B zWA}C%GAI!K7;PoPB(x>9{!VC87z|zM#|4|?zYeSOc{%UnnxQFY^(Cz6OIXolomJY$YRFJB}Tb#PI%Mee7N`)MqfF3}K@%Xu(Kx23jh*?WmCTGLb*r9V@c zTX7N~-=-9Vd_cE74p5bbe7RCYY!3cm%=rL`lYq|WSSMp)u}=Pg6yh{WHR)L?e~SD% zQV8jH$-Ig3(m;Vi*itnpo6_*zT2%3ykkpK8)A%4?KyG#yEzw4o=OL+uiL(xOD|BB< z8w>}?(@-3E0C2hJw#HnLTb}X?SRjkDx{Y@Nd46nme;!*M-T}5csT86z<(Kz#BESIX%z{`Y2KCRLx z(zeNLO3OtdQzyPnK*lw15GIo=&r{>(a?#%zfkf?%WHOxJ`P#pdrqTw{Owvt?K)NVG z00vyo0CQ~07E+E+QI!z`g))?Qpx4k|qDnJ|!->AcZ$W0$yrGqrdCTB~9HD>(6j8@_ zC`Obj`K78K6svQH0R2D+0Y?0=z^Gka+F^F#i2C4w-<5UJrCydZ@brbv6iJLK=p?km9ofl}?O1mr#a7&OQxHW-8SYMG>mNPk_jQ ze1Y&*!fS`6uw*29fI3WjSVR0~8fk-aSK@c@-RwH~!wEcchra|wxs76PNZp1%FT1VR zHTla1?Ctm)?6v0-X;6_UY#(i}%g`k}}QU57-Le98XHIdYRSt4===acznEktL%B z6*45^>l8UnIO|`4JT+xfzi093rer!1(qPe{ z@GRlG6y8ZVg{j~n&rR%6csJoa3hyPHe&qrl>aN(Q@co3}qj3DbNE7!eJV*F_3O`8r z{Q&u__%7kUN8oJ&zfa&D0)If@4+*?W;5`C=MBse_e@x&50)Il_Ljr#afF;HcvE+f8 ze+XAq1zwvg6x2=HTPTm()sKVZ1`T}IIy-V^d{n$n^@j~ zXrIUov3QD@Y;|FS`z3X8gBvJ>=weB><+}~XQDQodh%|NrVpL|hR*a4^bhQ7pVZgB<)P_03jzd1wNpaa-E;Qav*+v{oU^O@ zQ&Xy6|LfB~T^59Y2&vx;v>(G8d@2b75iEg-mPjNbx22A3$sNT~M4>DYg=F3cBttVt zvXuooOL9QxXb$K+%~P4=k0eVb1){zYtO6~Ni6hZcsY({f)Gwva1>j5rX9DUoP*2h+ zI!({e89Gbn=vjJ>o~QFp#=1Z+(o6I*z2ZpLReFtHr#Gku?VHek3);7!{We{I=N)+7 zh37UrMS6$6NAJ@2;aQ}MPTpDq#63WK0EiC(aUU=r0p=%w_!uys0OnINV?7{~)y9FiChLd*JznsAy<#2 zU;oour|bI_a_vYI1>U+&#d(2KYjhpf;l_~+J=mTgTGE~zv~lcB`d}~uski9E6m^S! zmZILKk5beE{X9jzLzh$3yY!0`b(=m;QAMh!s5^8eMZHH$De5j=ji|2$GWAoTCOi@7 zm*jo4j!e~s;?lv5iW^ejZMLXIPOpAnJVwVWO02M{KdBj8 zhTh=Ka;>_(Rc~Qu{8I*v;4NrS0bEkBBydfcWWE!2L?RRAO~F#W6BNP9fC5>Tp}z0= zO-B?2<5i1xL&tM9paV*{4vzbx*>;HL)7@UX>1*^=*QY@Ms9;f5HTdaa=sVAPAq^fz z3}kkK-G^FZk7_*^Ea^1E5ajWxvm&GcMaOoX)^m%3gg58E)(2m897OB{Ds z3q7st1^;Di%WKC&q1o%W|LiMN&C5&dl7m0 zJ|LfG{oj!+&bgn3H@_pJRCkhqfADdD3kyfWzS9#17gV1N0 zme+GbmW{TEW&9o3a0|Gw>MR4F3-wvvwjI|AZM&FZNw}3A{lT3PGHM9XPl&rX#F7m)=6R#2?o9 zmf+<>!THg(K`W6@2Ng~@TwuPks3v%(Z9l?skoZB$>CjK z>WKrQwndpqi}#r5M4OhF#h32~^-k?o<#?GKSgCnB?!3hoEqfhMSdxxP* zfaozN&WrvMw3~kcC*`SXO|NWh*9@(`T`C#%`XKR|Pc_|qYU>*t9HiIlMy;Vmm2FlV z5jUz9D&f0+@dIPjFqsd{q=#Z5lxRiK?6Ce$hjqvI* zdZ>BucMj1T_KH!im}bQ+YiR=1H;qwFy-@>HGOW67uIe?|+y?BTX|D|ExZf~Wu?wn1 z6t+i&Y*b6hKtv;bny_uNGJ->T1lRmNcEZ?Q?A1!S($EqTw}G>`f(g66rI(CR6laa1 zzOL3*M?uIL#o&Ui)C~QrQDDM8fd)%QrAD?lICm6_)}F8?T7Xk6!mblm#pqKk!>&<1 zV(_?y*prwuv@#x$bg6z0Th(01Uyph3M$T^`tp_Utv@#YPT)i<(y1(O!E!&83v!RB%^l?KRz9 zsx@6WGvW+zH^J-3U5yea91{UJxL5UD%?TF=>Xtk>RywovpP)XS9;ZaEwUfvj#>GSmmx(wMaky=*s(&8-axz=%D#G1eVr zhmu~809VEU@U`k2QRnrs&du!&$O{-iQTq7c)oKH>8}Gb2HW)sqQgt;NI^O#;qqb5V zXmxpP?5eS{UFLGf`}BILQW;mMVy;!~Ey$gfC*un7&Nz{wEh7r?-a#71v6e#M+Isx& zAAkI@_?3_6F_z&Q!W7(NejxPmLuZBL7SB)pOm^HbIyB;m!pc>*a0%*GPHzkvrFGt5 z`8dN{XX4f%=P{{bvO<#CS#F@WH9eZe*+eQMTXQKQ7L?(sluf2HDl1gC;{M5WqO@ky z6pxQA8znw#BB~=Mj!GPZVON|otusKRQz1h}I=@+G2Z%J26(T11A(w!0I1z~hqQE>% z%}kA$xRPu-Nr61Iu(^azGGz+GGsg)`#G6XSVZyLx6A}$V78|lqGDn>sK_%>=4oNPt z<`ZbNQ-dVS3Z->iGcGbF>?alr5ClO2$B!lWxjcRykGeZiygPy<$fLvqX#za*R@AMQm;t%K zau?_skl%_+j&}m@1l~!!lX$1_PT`%#JMG$T#_hRn zA)ZCN*Uh6puMOoIKu7J3F0GypKD(oZWc8$9dY>>+E~O zEI#AxcM3>();ZujiT88Pap#b87&-5CjyOk=a>9AaIfnQ9oP(1_;XREV7izw%YUOI) zTb!S-D?fjy?krX@zPieL%6*6QP%uODKqGtj#s@#Lzi{Bm7hl^QG;F*-Qp_BE>e$oA z-}B6~&%L*pYQ>8~t=Mz#E#I7W+?lb{XU>kFD<0Qhw{BNv=c;#V_4x(m`HOe&E!}VE z66asK@cs{6e0k#1-D*t?(Is=kz@~KX?t#Urh`GX1uYTnm0HCwl`ay56avFc;FmHR{SmZ> zTSXoXb_P{^fH-R|b5_j>Ol+*`*3?#H6imfot?xCVf%*kx3HlAIk!$s)vnHmA7yj9J z;&=o{HxWTsM$=-4v%t-=X-bM8o3qt!-*y1T>t+D#&85|AC>5Vg@N3y>#sXjwsZ%Ir z1!iCcv6hfpsuiusV=D490DDdQQL~-8>9NJ9`a2+F(3G zFaU%Q%`pwevgvIHj=;e*nF)|_bxhJAv|k6QX#(0dU9Q#YeqOmVuFCuMd>K@ODbr-q zcyWEUz?l~kbDeypmiKSFd5_f9S<4VSH|I4EDa6z^z^4u}*o^=QveaZw5?*~#O}pzc zGC0j4ciNLaT~zkCiVYBp{x!C?r|JE)H`ka2e)6NEG0Pl>m(HX?MN9!HMtca-L zFf+M$Gs4Bhqp4&RfRI>ASUaGUlp452_5_AP7Ook%Cfit;j3zI%ow8pJjm!?y!_+1w26)v-Tqfy3H<97FT{*fNCH(t#j;*7(q< z)JaI4ILda_3lhtywQ%v8u`q|! zJu#aCG-#PTeqkkQD?OK5G1Wj2zY%Mun(1c7k2$d*#r}eHca0!}a-VOvnv7b_beCBe z@-sm^h%H+v`xz(Iw3cqj*ru8ZE5UhcV7_E&;{wyF#w=jl&6RkMg zT`?E-UjvDt9l%5^qHjVT7fcOZ)66zAG1aj0`H*^K43gp<%KM^q=}OTazc@L5Zq>{e zvSHj`oUgi}U9EV&kW3h#SCyI{#_%0l7be2Q=__LsXI=`^Zf)_7tI9q~JBxSb!#)u^ zSH{nk#;;$PoSF74RK<7ilp++wDz1SC}+UkP&v zsr^XRj3|ece*CgX%^;*|f;5!RiloC@uo`_`>wshY+4U4#x${a8_!vb6>Jf{SO21C1 zDH)9Q>rUtY%zdgn+IY7vlcf^0r&8(fqFk%Tfvyoo+3ht>p!modCj+HO3e4vgcxX+>?ILSBr-CM(??nWfpy`{-mfGr5rHbLP zDZH1VR<+`q8^+Zb%7<~UT8Su6wK-r*s$WEjM}P`lM1%VGknfSfQFINMjkVymi>+bY zF_ac?bBKuE2ar3ePK2#Um=b`{o~}C&iBe$9Yk~3iQK~gnYe8ric{B*3abdcs-~<*K zL0jX}%Q}Ij33=KQ5rU7)=xrTR)D@)tMi&$ty5>zcv1ZEJ^ul#adLaPhvTM6nqsVT} z#iP1q{y%t3w_4L}uZuK_wbl4P16O0WqFMDbHVM&W8%;1%h^5~|iYa30%McH-rX9q5 z3nJtVFidNU(Ts!XCYFu{P~(RU2$9_=Vb9vjh6t0C9|ucMLgA15i6BAI&`d16AI#Sb zAWWLTbN~_4v=&CuZW8T&rCmD?QS_)%DU|wS^k)x)o~571l}yhiAWHgCHnzSj(y$T+ zjTQ_Ve)-n0WTfsvieOzv-a4;G#NKsaCOg|301k}xaWLeh?C{C|MPCX!QXGFEhBrfO~9V53-mAuU!KZO;eQ2qbPR= zk4L>eWn~hX{m{Vqv-Mk)gK1>8|Hw&C;qh)FXzSu2Ug*)#Y#bYJSUsVSQxDhrcp}or zlaW52a?@HPhan{s>Eu0;PM(F$Z_wEUZNAqT0vT-y(^K_1w^nJmY7IMUvvfk!l0ekF zLAfxUV9i+Gs86E+Boo#@Q)vP)N^#N96DX0SN*3+i!bG*~S87jbgr`JMsrRAnFad?j zUGl>O^sGwlR+w{K3J0g8zm=93H5TbFwSk3c3n?u|I)jF~rl76j{}-ftWXJ~Shl&m< zjK9V}yQQ|C-{z|vJ55<<@OYm^fU$tb-Ou5Tkq(2;T{CJUwgC>BQHM>8lH(*^INIyn zwU~33dYxS7S=Jm7p(u6n&Dw{f+8@)kVLl;F$z2gHquv%{8Lho;y=v4fv?%-wJ&1UX zOjq`V;vQ3YK;wyMn7Kf0Wn3&Iw^^M#T_qUI zBi1b!A*OGa)jGr$6B_qFLSZqm(L`clol>#n`c2_$0AIGb75HxScVn89wua8gx&+T7 zh>(h4ps@o|8lhXXzCnhTL7*Q%*aSFhxj@G!}y)DKYjZzkP}(o$Omk*(bs`Q zO0*}OKyXtafV30{5H+ToKm;u#+(X@mwtu_gt?OUyK~w*iy=yg!IBE2D`UV4Pt1c`- za+970?Rvq9Lo_?kHoNJ9x|}oL&~xROCr8O6xcC( zujrDF&2-=b_C_wKg#`D3S}YO=je$EA4|}j%T^7a0wpQ96?_hqB=MIpC*u^#~3~ssjBRyu3`Vbilj=vdyZFj1eG!D3rSBT{2m z7ZSP{lUT0Xib?K~iU~)nstm|!l+S=B0Cj}HT?T|iEin-8-a&`NL_SU<_Xl{ic4DT| zss2Pxx>Al(2o7TvV~ry|35(eM z-=Y|EV!wpq;l2!DL;*Nz&+Rw zPJE#lVY_>ixN>)t+^&X6In{Q@bD8 z?m9@DF~0|vF>qBsg_9D2+t11t<@0SkWFtJVF3g`YO4!TImm$U2R#C z{axD|Y5e-x3+FFPO{zQ-xoX1X#S7RMja>|5umdWWNwMkM zDokHGGo=fMiRhhqg>Z>d6=ugK&s?~0ah#i~$uL$|4g|;{)=ua_sLSl)QNp9QG+ixw zUP+hROBO*h1b0R@e%$BqjlGaX1KuD^d%1S3AF&+L1|VIq_rVwUM>OtnC!`Oq29e*7 zGzDi1V~rNlUfbX8UfVd|!`g;+(O%n3+0B#{>%I?a0lmn2hPl82l~L&hZNaGELq^Mb z##R>V*~Z$dA}8VC8|zt8Wj!ac7CMv;E4Qo*oHn4f@1aH-p>ES&*JcWBe)H#QGmZ63 z9>MMUiKx}gx>kE+J#TqryXzor+OTNDs*m-Y4D1N*tgN-!HXg8c1rK_hIKYqwSIQKH3aU(!-%c0<76W) zM((G%9(VFQxJcocgNN~Lp7v|#ahjrrf8=LLJfg4c21GbQq)8K|POcLeB}J8MCYKHe zJfow6huwsO6S^RlHR{I$J8LY1-m(8naBt#`z%(}k(;Qj>KjV(%hBo+tI|@xVQ$Y&t zr&{{E!b3trIL^ZJXWm3M?;&33hU@(HFJ`OY}5r__%=y}jVFx8cI`-1@)mC%K3T0# zm#f|jh_s5r#5jtATJfcR8zyuGP5LypY0?*|PUB}Gt7&+Jg_C!+V^o-^xiC06IJE(2 zUa?1Bkq=3aKI0ebfKa{i!wleQoiX=!;!%ynJl1PvN&QWB-%+!vVZ(wdo>3go=Qz%@ zNHk(RXV&{@p2ERE2@;38Z6;zCmIwtkci3_=XX~vZHjl9k7DK|uNuD)es<+V2beyf> zkLnUtCn0pMZtPV^%rOurh`%|2KlRrUG>-7lQXF}ptlcb6&jBy_dlmmSJo=Oi&kOi! z`1k7ho6y$aGU34{^*L6qG7zRD%uA+G=J^yd3aQQvs&g#)c?N%r!FdKRG5B=`>u}%K z!F`F4eU}qJHPaA&Ld{6qhzCveC8VBfiAqI6mMx7M&tSRtU|}ZIDa6DMicL}w^x$kHp{5r0B9}N1mbNmtRnPOejFJ8t zmhWpgoM$cUL2BN;c8*CtEu$^Jqui`5SJRt=w_62am1w-p&KWtr(4Kp#&!Y1nccY$aC5N(Vg z8eqxh#;9emWvDvYV59USU+TD%#S9G0SVKm0knjbA5fg?h1Y&3bD~={Bfv33%wERPhi5hkHXKtYno3Ty7P>VgoA)+&4OMUrKBVI8U{*MR@I4M(o23CI%OG7HxR{6Z1S0QAJ!?!AP4bhB41fVISP|M15$wj;Og)dIb23!=S^`!;dMQazIfi zHQ_%IY!0>rBa|9|?7b(A+JL`xP1=c*n#+w~CgZ9Bd~R#;BH>_9AU&hLt$Pv<*6(a> zJ^}f(70))uZf?i312e)t(<&5>H5?2J7m2Iy2&CHtL&MH?w3YzJOF27GI-z)?v)#!9 z|67BtvpbfJm4x>rXJ@c=&HCO-ylG6-Lew3Vx?h*NyVlfw>D}rE=4^h}3eZ|JALIqT zglaguAKx2l>S39-_4+-^0U3lQ!?G1*7 zV-0id>#?m^wVwcQ`vgaS3G6TVa5!_I-ZB>Lq_?{%Jh7+&Xn zXvv)2-5d=@BdETH?>&K8+U@TZ9f%4&XU=Z!3UuVWcZyOALPsy(I<} zKBlFv6UA*SDUZg0Ugr>~s;jSHn|}bDiVz(Rwml9ap}lRI_G(`bhW#foziDv9VW&q% z|1BSwgdRE!ePvIuCmQ9~xUE7txCEkyFJg0IR1Y=x276}@J4XP`5$GRBseb?_d;tST zVe(9?PdZQ4aOH)P*FTC`JqG8vMPC{1A53QPq8pE{Fb~3a9caL{yk0*ATRr5u~P2sBfXzFW#j&20Df=*~xU^j8?FYPGqV&e_VlBFG zgyTP4hrxl}Oan?S!irptj*Qx_ts@Lev0L2uvH7E>Tb;= zLS96_CmK6iN1cUrC!N@I-*IbxBli5xlMU2=*wP3h=D6k=8p1K1C0&j~ff*xI1*K5@;_1_!aW z$u>35l42s`hBeGwdkF^wlb6TNj4Rrn!rsZt<7Y06T`Zk>Y3$0Rwnp4zMq*<8JdPc- zeU7GgMI%KRhePrC@vvv&(p0H+){xacSWy#KSyt?Ja+pV}Uf6pHrVQT4(#H+CG0%fP zBPL&eTX6NFJ5`u@`NBlx(S`Wf^;SGKHu0*Q7lv8*DLWtsp?$e7v)(Akjj+CW@D`g) zj7?6CUzrLs`dtFxVl7m=m>WNLaqRpg+{m=qLtm##-7BjamXjCSjESR3IB*soz%C{h zP+!yeiVh%Q|KyeN5}PT#GJfUsrO9!*L#Fm4Pu*w0y}G{t@G4@(?ATQ4^!WJ;6B8FE z&KDE-8lN~@D0Ep3+6IGSe5Qi?e%e~_MN|&c+S&v61@(9MZPQD*XqRweqv*FK2G7vG z?J8Uv0`n@S5oo)Q`T~28(^2WEBAh_VzWz9-p?rn?dRT&Yx&4NyOm#fmE8X^vTj7;_%Z$ zS_WnN{dX2Ex5sZ{4fvl52J2{vKiR%IL0O}1Pk5Fpp*uxOZ;OUPI zSV9leF^~fPXd$OvSBzbs0hK__!Pz|gb+nr*ymDZjR!c>k)4)DHY+Rxh9d|8w>Q9wU zokR_s>B|NSx3Xd0ItN3G<(n`{ZNa$^%BrFhhw>KFHg_l>cFVJ8VGGm>%Ym5+<{s1L zeL?#Y{66SJ2pctSxtuc8Thar39mTLhh-hrOxCV-ENg3Ss=DkDd`_H1jzbAdCAMShU z!?63e#>D$7?J=SC0cj6*ceW=AEpA=5$Ms{~Hp(5B)-w;czVKri8C7A^EBZ;a1Lr;{ zeWse1wzJWA>>w_wAD7hLPAbpP3c2V!{cX%qV?#?SA3B&nk;et;LL*i8N)=jh8`)OtOlqWCUnkT*VeX-y z(%=j(Z+2R2?0>j8o6WO#C`;(SEc((6EW9FLe;=Jhr|uQ6T%Cu~m}inmh3xr@mrg^h zihNPOi*#6zd7`dX7zk(m1IGS{!M|f5!eXsWSp92c^n>y}3VS*Mkr$BXai!?h#}&n^ zGUPhU~>J`qi1F}B#D$bhHL)&A9?3U|H*48W{G``D4ju+tEZJom4;NlI_ zGHAo}?Nf#aH+4Ub6=p8XFoqH{bOL9I+WshI0x5d6={8srb)}@O+XCIhCmMxl!WTU^ zfAJEWy~ky;wN1X9ha_zIhc@<$$AU}=e7@=Ot%)XIhUH#+Z9r7tth$YZU5$1ZZMAyy zzVCYNcK3DK?SjC2s978~jsZW~AGoir0_ZxTV1&7LsFSrP%!;@Hgb^`NI6#O&eRv)7Vlb;4a*V9DbvEe*83RMRkK1{AxfEI7OE>981^N zUN>?8V9%!Ef@a|)GmToYS)MAUVE|_gM+e^9eh=s=Hk*Zyq^7K1P{%h>J}17cwor$t zzf+o53@z5c33yq}!OSV>gE*e4c!fT30F(Qo8mn~IR&O!*w+uEi5Ve#z(>DXC7s~?G zYq>LPXU9)pJufcxg}BVKZt^LXmz7KfXPxST8+i0py~sJE258VN4a*Tfh)cM>K$YS0 zq==`A0)feSwAA-ew!I9q_~65(=&fQ=>M8t${lLa4h;_^O1dfJ3!MFJU*Wa75H;p&V zH?22gZ`w1s6$97%RMUPC!+B49#aem;q6=qZI1;Atn}A5bl|-IAfYDp(>-fSoOrDuh zsDatPANH;kdXj%h;(Z)3T%YB{AeP`i9g#z0*v-^;?q_krmO||`$R!VQNr7B&K+2z= zc6x%8w)ARZs8#Q8!TAPGaGL1=S0v{Q^#e{l>K;Yi9&y_0*R`eBEbIFSVN>A+P!Mq2 zyF3kRN1WnJO7;fnwIxANHja|J>Y8u~S@>Oyk~V!)eHry~k!#t!M2`wbSj+C z`T;pG6}iIn0haz#SXLx_-LAg@)+7sx!-i%?TG8LfJ8cI^>CeLH7R~|WB#1RQ0u71e zv>_%H%wnEbC9Lolup5f5;*C!Il?YjySj-bI|g z=Zy!@|9txaq*P#N?`9d$KI?J4$=nS%WYZnmv-L_%Q~>PNFEaTq0`QKV zc!f#ct5oG`n2I8vWZ|;Ij1lLjSb*LYIe!i9Y7eAeLhPJa$EJR62c)$w zk>UUaUyXl?7Tez5BnKPMBpz=RfjD@KXa^5)xw!@gNzk%wiGZpRmP@hG{H#rsT4IUq(k3)Z#*T;yKLZT!Rt}r7rs;}Hu*^>~> zB4fYD{L}~B`(g=E)VZ`H)F&CsGuXvIq|^h(-ee&5mDd^j6$am7@NXD=m%)E#&{j`c zJ|z@fMcaezpa>kue;`pmWXV5eAl3tqvAqmPzr|$56Hiv%K9Lepv-$zc@TyW55exn1 z*5ap1)O`x&AP6D$^iDQm4yG8_JNX=Urufnts@83}f26LeRh*3Mi770(H>Q5eXA}?p zvoi3hVra{*Rqt*SW*+tFH>!8qcw;}xOXS&D&Q$*c@U(?(3LkBKseuoY4D};$6p)TM z7QojE#(BD>KmbICmGS#~m-6&c`p_2SCBT|3vflaAV0&;o!6D(%YxGB^SmdRvS|k>s z9g}TRptcw$E=R*_3tCQ0@15RlePIT~7&8M%HMs~eamw+(m{Kjipq*6yD^l^VW$w(k z{uhT#neZlQMCiOt>|q~ln%LyDnal5S_6E@gcOKl!^ZrLpeAwX9^CNa?@`{s**hJwZ zyy;3#eH#C;sh9s_36>xJLjm7Y-$1_l9RyHoRlNbbFYH%B!a~t+Fk9&OpE34L2LFmd zk-@hZ{5As`Ahm_^pCcBg&cHqix9C^Z2bn=CQ?exfC1S;m-DbAZFUJU zu`90@`|vSwX`+*mYc*IB7wO_a`bXsq_-nC0t&K5VcKiP~V^=hkM z1eSP6h8x@4g$w5=E?pTvGX_)Q_c+jjcFxOJFHT*!cwu5Z>})yCUYf$KSgqgwM;71E zE^5u&(;{FM7^ZN|`6NCT2V(IavX?LFHOsy6VGv_FSX$E5QrHNR*#o$W}KF5Gt zQrU8d&MIq3NTEv;-pnFeoSoGF#OnpFFpu2L#zj)F0bVKP^2QrZ;V=eu|N3pwm_cq` vzqkeBlOL8gn1elN^~Z9%atpbaQb$u`si#xf%twun8Yfc+Q~jBI>e~MU>9yR? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/stat.cpython-36.pyc b/venv/lib/python3.6/__pycache__/stat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4bb9f3047568f26f3426c28a5e025a5089824ee GIT binary patch literal 3890 zcmb7G&3DsC5?3pV<2au{2p{dw*>o^d=vVL9FRo(hkb*owrM@ACD z{O86$E=bb9rLNxy%8Ph=H)TlziA%sZ1DVUv$NNCx3iR`Si18Q<@BxVPI1KVZNbm#< z!SJ6YJ_I8$itR9r@evs3qi~Lo!FfIo7x+1t;OF5YzW|eP34JEuGF-v-B3y+jY$stF zu3>u#uEPy%FM|qSVS5E`!YypC!fieUGkn^f=GWkBejR4{4VdF9B>7ixhu=i~7V5WA zpMkslYq-Z}VV=(+$0TySgWT_89QQDudAw67r?Kxo+P^`+2k8G0xqb^N{s_|iG2G|h z!8d#X9`Nt&^YE}C+vD&p;ut(a9D&D(qwpQ#Iap}OjhKB4zQ>l?x8X_H&e&5+5Q3v51joFtR1gP8L@shtX-cB6-ZhGG=rIv#Dbyeuo)+fzhuX z3?KOQ*bsMVdrO@A>ORBXNkk*XUR3c&SZEe|}Z-ct$)wb*>YD2iY zDw$Phx9tjFy^}bi-Fn0baEnSueFO?YKS7LOfFMpVh)^eI`cX?`vUq!BKE&<4C}9}# z+k#>Hd!nWK+qOzi!Z3&|sST%T&wA>v3pVP=rCw{Po3`rNzPfpkQ1ORR)VI-LE}05- z=f7i;^mi%A0)>W&A$(W}zh%-D&lX;~whOg=2Ryfx275o<-gbSr(R5#@_wCkxdedp8 zQ>k>**-W<&{B5`OF!eZ1c}TSnf&sIt7fLzpB85TmNQxLm{H!=vzaUPqy}EEVZI99r z#zm=6{e!mM2~+w{C$1zD!${%(feNZ5K@6$p3)U3M$4oIXk|Qk=s04o^_?cjw;BN%K zek>SzhL6kk3-j5Ij0?x!&UFH^#Gb7>jcA!1+=8@qYAQIwuKTVyNF`-K&koa<&*{cT zC{uP#G^fxv;w+1ED1SJ+A0YJXY(n+znyA(B)lj{*U3Y3t71!UXN89Wq$?VFRB+>k! zizJrv&nLNXHp$JVTi^LK!KKv~XJrx1kGlxce*Nq$-aVV3u($S_H4(m>CzEDq%V%*y z^OG)4m%fD4{j)jc^?XU4Yt?qKezl#pojgeltsfy4r!7aLpLa34@+Hjfoz2WU*xhuS zPF-y}t(}vsR*PpYA)1%ENYRV@*-JR{2~xPlZ2vtQN_}M3 z9SM&BhpPJ#mHDHe(Qvd#)?Z0oAXO#6B7=VDgCG+q1mgs%6tL!RY(8L{0fT_m1J(|h z2-xd@c>yy6_9kF{z^wNfpc99Vp71~^qp&5tV{aCHDJT7L;hp^E!J&+j`Um-4-#g_{ zI_z7-dq)-%hwK$QRDNMhDoa02tVyH;BmJkungsGI`4Ba%Z+&l{;`zF74s3~~x^mSC((rJK&8s$bh|+Ci+=Zrd#glvl3PO7@4< zn=5Tw?DGE5gZFJZK3Aw*^;Y%x@mznw={?G*Br7bzM%gf8Ode(85%%Hf$Ldn$S^Y?ra6A*Rl?&?RH(g-9yAm$D>< z=U-Uf1{C733laxSP`3Mxs0YJi~EP0;ohw5RZ~_(~FwP>6_BwIZHn zQO`?jJroQrlS67%ea+ASjtrjWj>6eUMN(o%+jhB8ZzawR?LNBshs(JMdL%EdnHQu z2rAi9p=@ZTsYPxpdM>9G`H-2fW{m8L{u29#QR$kOOwqjLRV;NTBgHIc%H~SR5_B|$ z+kj8z^;NB!u`EMhs#qvRv+^rF{arjR_Ly*w=vj?l?(NnMEo+sGjZ+q_m^C)a7E zsuSLgo~iVrr7hzcZd6SR7qxI|T(M*nGOPS%&$wdA!UW>rBJJoLE`E+rpYo}iS);O4 z&1J02sdSX`dEEILztl5|wpOXQx^ZecLn~(tQ>&IsNSa^m8D>UC>OB>MxnWvb;Z(A) zuUs-Rn8x0vdZ`;$1*7h-(#K~oq=#SOnhzyiE_ z?wv5=y{J)DvQ!E!UHh(BI0*U5b}M9I2~X?08dLRWZXI3NLu INs0^n3x;-Gq5uE@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/tarfile.cpython-36.pyc b/venv/lib/python3.6/__pycache__/tarfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5655637864393b3f2d96572c2f1286c8d95d892 GIT binary patch literal 62617 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

-fD{uMuC`7(EdhpwfF$*C@Ct1 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ÉYkNuTnA5t3a!kNq! z`om!oc>3RRpX~&ta(sNzoKlWo7h#vnXbezq82_Yrbo7p0YCaTr}?m<|pq<%9)7gT@^X4#H8?7m0MR5D=}5vJIcMp6zuc($ybKIvm z_P&PdBV3gs(vV;*ED}f@UI|Jhz9hF?uM`+BhA0xyG zV;OEfz<#lR{Sb;grb^0|x9nGGN=~RdBg!4K?%{Z_(!h zfrkW!N|YxA=Y=7coKR?Z)6RxYfjpSP%$-uTq>}SXir8x}{P(JF$Tg#(Hf(;$Hz=?Z z33hXW4#(!!v?07cLz-52S?rS%n0IRWmrTz&uF}7~w0&gOWtFGb#zbtUmN|wzlc<}V z4Fa8y&r0UcC?@jP;sqPcU>Z;mCmnA~zm)GwtE*2ZV^#Zw-cjw^)x(z6=Fnh?ZXJ>P z_^mc#HWBytC{$IuZ2>RH<$?h3=_+KVdWo(_P0V+jd7O+IDH((r??QpdY-~?%VzXnM zg{4QkbBq!ORdMHS$5x0}PF+}l6TNu8cV5D{1{PJblfyD`R?{2@(0sBByURH@?QK82 zHCw04t1ARnfgYIz#hm$qDPhIKNRlB!=i#&#Pb&OpQm^%{xFYHD2Ao;1t>=HHna=OJ zm?Jv&MIA6kX;WuPiE^Jhli7kXEU?>{i$9^~sX7zLq%WnVNHi6n=Lam0_SV%ftKiKc zPV3V>HRtdqp)f*iTi1|oa0HzO5vu5AlWqv@k5390jxiwQO$n60*#;mbDX^9lsU~xb@Djo&m?=g) zFD1+a5oCgXf^zFMU=(6$5L^&#>IvnpXW7l>Rs@#FG+W7ax#l_s8<~dHjXF~-Twh(u zBs~z{amG0y*F3F2YxBULz49<6d53W|J<1$is3p%$h+k9AW{4v+t}DaK@zSIcC%A%JMGk+q_Y2`GX=VpPl1-j&EK18~Rk= zuTTXm-rOuLo7JiNwu+PC$lwL8an6umR89g>2Q$@c>v52*9(F_FedYe3!e3SHnsRR{ z(F@qh(S~!q_L9ziSLMXaMBi8Pt`ZBrCOoy_OQYW@CrF0rzMb6eulo5HC4W~U3A&g2 zD%Y=Bbffr&PG~WA{Ih1jD9~sY2}j$M8$p5@FVo94OmtVGRc$PhSFpFE#}7CiKBNvlWRU;c`Jdwdwj4WG_=aLIPGpR7P%MX)>B{}($;yGsoxxtNI>ONk(K3Qy zl&BfE5jA5dI9A>nl*^@Hd$5-)3&}`QpC%%dDnG8_so6H567&-t-p#vgx1@_a;I?yO zCje|Y;KzBtT{05~m$IHbTJ;fN4-c4RcH5Dw&sf`C|Q zl~NdxTf%$8$(~~b1L4Xkf2Cn`#7|rrcr6oc=o`qeVI-nIqQo2sZ^Ni)+I+#8VI!ayTh*hn09;B~bhhaIWI&CdI~4;wjf3)Eo3X-IzVy1c5B}_dgpo4O13F|L{($ z`(NQ*uI=s8%5Zo+g%=j+=nM8r}!qj1lYnVp1?2&)7dp|19*wW53-TL|9l;QFrXqwFFp z1dJF24PxOUUdvs1`D{;r`!@ZWcY6=d&;9MWZ|W&qdyaaun~y(02)$*(AIdfJvTbn) zZh(B7h0r3YNHD=r)fz6b9?tFrsmEErVoRG-;y5?+OkA3o@g{|xauXJ4p@EirVKyFl z!dZ)YHsN5tQ$(@H{sE+ji{8*FTv%ATOeITkaR$rJW^1E#!r$>^Joz{fUofJD&_hAA~H=rO#8cq4mgWB7z)P8vWPPR4s5^7zqib7-V#0mOh)f@d38 zfgNu~6I9o&^QkzPnQ@A#jp7N-Vkh}lcbtrG^==Ki6`DTWsqmXTPD>5K=%Yo@O;T;J zY}&KFWCMh210?oZaN$TwYQn^`w?}R5jryj?ssrHM+C3>SS$}~tks*%XO)bCBGINKk zaX(+SHpe^d%IX7^w+TBl zFGP4}7%PtkXR+>BY1OCnYk94;hHB-Slx)s-d&7YAow8M-(#=jm?fdUITGbAnLe5)a1HfEw;bdAG|9|!k(8Q?}Q zFTp%RhT=O=z)a~@6%t&cS(_pkoLP?ItP$03 z(^_+Wid-c(VMnBY+--TGR%LMpR!|}~L~!Ou)^;N0+zv{EY|X>1uvf8v@h!RC>{SGl z+Rgb2flkybFt>WTMgypfk+Zfu&cf(`atD>%t>loB!z2giBk@mW;j9?jc!+AuuiJwmf$E}*NQ;*~E8B7yGrM*+Nkg za4AX^vPBZ`Vm^aJe0acZ2Hb|g!nG7(?}K2+$W*YcG8qg8gO&UipTUt`BhP2nDtjsy Y#)c}-XS$!AJ$ZNRa4Qq+s0B${uFUa3bWM<&&l)2`{NndzCH z>fx4$GPWy&h2MMN6YHw@4Y>|Xc+(5==mGR^#y#w zGnQd^M%D04&+>Af?d83KSM*BWkXQDGy%BG8VYF&`W8SW&Rn5t_UCqmPp<0yhQguka z%hh4|9;uGvd%QWeva3378dA5rI>u%myxm)t`jLMabq~+5?r`;})K8%PkNl&ke+2cq zu7tY(iW;Zt1h%)Q>UevrkNO9;jOt_Z&b}?{LsON|;_>RS;E2@impY8J^aSck-U08S zZy42M-a+pWzMu3Cdq?m+={@Wn#rN^g8{Q+H^9{puwyf%u_o(+6YM=5R_m1KFX>XT% z!h6Dd64xiaN$)tmr@bj}2;Zl?r@Rq-pGKQ!yr;ckT%Ykyc%%4!*1O-dY8SIJQJ;6!aB}* z=azFHn&JP!^~+1IcrPz=)qm!{RDCtrD{Fpb%W}_qSG`v~3-7#&zRr6&^p!(jpTphf zJR5hme_<Dsblkvm78?tTC!79Vzv(oB$XD}j9qr~@s$5sT8#RIjC+hE8Uh^8t zuSYG_z*vrRvDtK5^G>wr_jFQDM)jPzbv)|MrtSvLobR+l-*eU)(PFC|IrF}&*oDII zPQ4X)ji}KI!m@v_?yur;OF5G(%bdw1#!D|9bQ-qjmM|43YHfd+6D^16zUetZD@wcJL|1B=C!)oT*ulYwhYUSV6`2ca9n^&zvJ9>n{7N>YoH47XaFi~ zj4rO;J6A3{_&b08ynvsZI=!+S5&*}iy!Oh<2J)q3MDMAwE`fxkqhwoD{{l+dTne6Nv zZ`R(pc-wJKIxFtI#!7p|3EC@jzHF<8SG4Fx*>WS`4p74f^nFY%4hTV)u`)~K& zTy3?Q+Z#<}jjkjFw;mT0Jm7`wY+TTk5f_s^h({Ovh=5yFKDInA@)|&l%Sk=2$NJjL z#lziab01MYRi@0ia0BaXt;FS-T4m!XqdmW6A8Ww6?5G6W_Uxxn)A;7~o@OWy+3owN@D0tyMqZ zFgLEuR9=5O&exl*(4VqmYd*lo`+=bjp|_9EpLz?(7oKugJQwUOYz3!0|L&>P#a7gs z2ZK9x*AMQVYBuIht*(R11kX;taEg!+Vp?5~^EFO)mb0@_80MI%IL&MUT*xp!vVf;> zu|5(R9fMPb;M{8)kqN=+B!bhtY1}qE>!w~#u5xX5%98%#;>^vfO10FKsUAWvGJ9Pd z#%)}z`S%)O6yC;7SVm!(mN|mi6fAWVcXd|rkHF+iKaWrNRTQ4NY2N!n$GBpA<MUxNhkNUnIc=z~lfE2~Y?b;9EK!gOWhnagf4 z896JBdnrG}dqFEWsktLKpKw+3-d5lTQ8*1;C^y1JfE^0zew>$vaSr4j56z-e4bNO` za~joQJzR~$#W_@M2k}I$5zPCl*3-@<5V_rkWt(NQ1emidSp|zFKBjG|C-A&Zxbu&& z=ST3t!v(RSV|J{q+$K<2V0WmK+cGwR=5lwglM_gvj;u{1C`Y*^JHkF}Vt?fM?d185 zD37U33%@(G6<^P%IFtz-56h;cKcBc$Q%`8xq17@Ci?&@C~TBMimf( znrl^UKTmb|8=$*tfl4vdvLY2@d_y?~gv#-rnr2kwvp4-aZLG_8p91|}3;+_1L`2*H z&9qJgpb(oKKk%SFg~Ig1q$9rA4geOfQIFg?=u=wiKy)uQ>Wh>GPUz12l=c+k^_HS8 z7WtlZ1GTCpTA9`wDBfMXl}IiMGmu4n5qn$5&V&#s!2%k+0cE4H+SIZ!T7)v@g}p;j z!jUFJEV;YJgixh2YOMHBUMN!sts5g_;t=MTYD-O5pK#~uP;wR)8%xX0m7ukH2ZFSH zckSN##_4CyJp0`9FT8m6rCP=u$=&n#2r+O&$=wC@!E%WHp0Sl%&Z#FO5JbnQ*&r07 zmhTu#g4C6`R8zr1ZMES|6*N8;Ac1fj7xC>zp!8xg?W)bDY8rz;3fQ6FoUaz^ZN-;aBLx|c3kq%=7yyE4w9VE-X3vkThg9CtQb`5?=RSj~?SqwSHNvk}`z{`a zgot5o92qoH+Atd~6^_Jw!FmA3cprlCD<~NORn)9Flm;ohl>D-oi1^B;ddiD|k zxkcWbuk>}sDeqxtr0oTC^p%lK^F8xDy!NZs9l*Rhd5Y5M)36=eD=X``G3#-mzSx40 z)om!1J}$q~gis<&KK~o+mJ==*8>a`aF7WR~wc7M6)P|bjd0eC~e^kPYF{T@ryGX8{ zMP-$PHptzT8!Y&-z0_(1keP&Zwb-Nzqe2aSOTBZ7$!_DMZud#lkOJRSJ1C^7H+lB5rCuW~rCx#so6m!BsS}UE0+7Zu)+hKj-hqHg6qjRATnbTf z-s)QYNt+T|Xv<%)e{|!^pQpu0J=b-(rR0TO-Iwx2Tb&RRsXeHZ5!TNx6=;HS!Ci%7>BTnpI4%HVc}K2OU-ROzi(om8xpt&=3-vI1 z09mvZmNu1(i})e{szr1q9k7NM+x9;`P|E<6uDQlHe-j;sL>R-ib7d$SwlRk9z1Dcn zGAHhtfu}aIPx5LQ)Ga@Lg^%z{m{HO-T_ni(ELh)SQ1%FWmh7cG zv1QY`_p_+r0gHfB|7kN96{)&zLIFXGQpf7p(8BZUQ1+IFI{By!1u?f-*mz~*sc0BA z1?_|SAorKXH;bL((uh~k_~RA7XxxCRd&}^Ocz3iT_1XPcC(m}bq2kMz~+x-UK55b-Zi}_$5RH>R5#-V07KN^;>Z2UXA=MuL@9v|cb zYkqY*gV|dfz*c{R#^E^>#!vyu_89of2+9)7NJ~ECF%MbeP|0oF+va#~ztk6?A&oea>?ei+h{GO%ZrKW0*6g| z6>b}?nv2mwPZ+&NCrL!I{aptn43|9ij9{pxFF{(9zG_f0ma*IQJ8j4uL5R4hfW~gB zzI27Ms0tcfU7pNN!~c#2g<~iTo7RbiPZ<`9YNDo2wU&QeekP>e6Pw|+1PN9E zw|*biw9vPv;>QP3F;Q8p9!=K*D>zmTh`QBO)kB09W59m9p= z3JT8gdGCZUgDL7m@RQF&tRs%Fs9hZF0CW)6Rbv(Yh;Cp7(W6#4P0_9S5czlVqNp*v zPn0f12qv}LYLYFeYgOP-)T)aNATNubAG$wG5yWyNDxu#xAxjYt|5`))S1`{sED*rK zFENy!(KNw+`e<|h0#umpc>2BVGcckxLT?R^LT1=)=xe ztFBGrN;l~={Cj@AEo1i(4Zz&3=X3yWkkzzMJKvNpdT19f5TuO&bPjt(BEa>`L zfYxY;)>vF0NBwZ82%XWA_!D(T>W8qg_`h~G(HTck_oGB-w3o(2XZ)e`xl4>|UXR1L zwwIW|@x!&VJvt){X6T6{+x0~E>wv*qKfjR3*bME>0g?igC6OQ@qQuJVzN1~)7u7<0 zg)t%_L1-hykxXw*@&$zNvA0Rhy$}+Tmw;b_tHe&4ZmYC?b-$cXHkQUiO_3)ua@6uC zM5+QjnMBVX@|14-Nc6!FyF2s_*xmRs_CV{}#|P=!-3|nLVm4FZJ^`%kYTasuw_UxB z#_}MoJI*7x+)$sQcT?q70g9>8Hp0>*waVw2nyv2eb{mCJiFun8Mzz)$-3z_BSFax5 zrdJoJSD!=6j0B6g$>I=S#Z3}g8xv!VVNhc;ckdjHH6gTVc)&o6AhdjxUn(pWh0yXD zp%p-eFyz9cox)Ay&QXxVP*h$ThIfo+lLSTGpWT-nc2tx!v*-3`{O{wuM9D;QCz#WZ z>0x7~(L|C=ua)-a!1e@(buNfjj$`$A4Ycp@Xe#NQG%sQ8@I&a;)dL^NIkv4*+E3S5SAyEO` zzw6gZ6c?SiBjItzpd|-o6;T2t(!f)jN=62{WOB^AfrbsvAWkE6mr-N`ukdv)(x*Ct zk)1{NE`&7FoFGs5Zq$-)gbhInUet1>vhmm;g5x5(q&798qo_?_;C5S9$gOM8(x2)Yg<7jHx|=ioDj4KWt)txZeOI1URK(-?-V1b446C+^>O$>jZQekaB7rjk>TI zJRzCu?{hNU{hcyr!4y8nw=b}`$l?+Uk%Q9hJ>Cj?Ahb1@Wd}BR+Xc8>iAKugir?Ts z@SC_3;2W_xR2_`C8@%!N(2#9oljCK3d}dgeUUlG z_%4AjjNyAovQ2l#`})CrOEIdZHh!7`UrUZPU7zY!(Ch0>H_Wmw=@m$tq}-b1of(l( z>bB7?3>unWk_8hr7|c}|22XY_yhAiAo%{(4hItl{ zIf3tcR03&C^)m)C2cfrPxcDSvfG-89KhPw|ChU|=0973w2>6U&WUPY95U0+q59uf+hI{5gxPu~281@5#ftWZ|8g-?Ud!PPen~4J7 zG{EecYXhG#EEWWfJ2p}_Y_u=HekpEQVHN5Tfq`Y4Mkhxvaz&O*K1a}_#F+9&I^!%J z!AC5p_b``^`7LofRs_AlU>?WQxWMe&g%DvPo9-u#`b7A6g!i=sSN@n#VYi00@#0SK zfCj+yk=}HK-ad2&0CRZ|-apMDii>V22`A;6_`Z;c88SHJu7;|E28s)ab5J|tA_5s~ z3df?bej!`Zb8Ncm7ulAi3MTP&UdsZ8YmC?E8U07jpY(3ni~u7BZ0^r9(G1ZVbK}uZ zT~Qw!Lth#{>8#`?GyevgqVrY&S((>Rtp;m}Nh&+AuJ`fw|Kz-gGzMm}@yJf|NIJ^I zXNqc<@nU!cg`P!97lJ|}i8?lYjTJaNWllg9=yZfXnOy?QI0tn$&P!HwY(;Z%0iFOP zLG`df;efx4SN??a)vT8JJv-Be9_F)vO;mep-Y+uQmLJlWBof@)OL!yXR7S#~ z`6cZAof2ifhP5fMP9%72Bf7agRY4M2*rne30#I;gCL<_>oM6UQ1_?D0W$$5XiU_5+ zOR`LzEi*`zeGN_ikU${*GEt^nDD5j1O8HVz@!7|@wWsGkLIY#AE}RfobcXXI824>l zz~KT01&fV7@BF5{S=cPW-#vtE0)*EPE<4>R;=_A;#z1|(Q;;`?5E#q9V{MiawI*zb~93}ApQg|F?uWrcc4=6KmYibKeT>LsY<7Bh3%+yR!4o}s*EHe^|F>!5C zDUoh4L!C$(vo^@=hW5zNu4KMX^*ZWT*O1zhMBE0iOCdP8J=JU z$(f34$lrqtot#We5ad1$Wk?bilZ}Z>=@wU@S5ArIL#@l5E znMj$8j(o_NfFIXJhJ>{j77L^>aw3>7Q8wc|SUV0(6zb~>FjM0ptl^C}uU&urYMsV5 z|7h$`3<(4J87>AepduJhDYDde*N=6Oy}4vxqK1{y8x7&@E~CnQfFNGt>t#+sA1jK66INFO6H8g$ zQH&3^Cd}&r`qKFV?)e8`Ys8>!tc_I<%--aspM%B8`xypj9Ol8xA(t>4T=SkvT=qxp<^n$9|3cAcrQ`U6cUCNO6BfF*%nONS zUQ8_WlDEqn7Ylv2H-Yc6x5wLy?_qz$+vn|%GYt+I`6x+Wj~~`xM4HfOE4a@cj_lp7f?=%!4>Ddm43z za02!j?+iSMhrMUL=TLLRd)|8i-w%86u}_^-IV^kQdxJd)aN9EO>^7NJNE8bpVsU;# zPVimgfywJLf|dva-IUXS*Js$wMIaGLjD3bb{pCK6QMgVW+1xH7)uQDjz6QZsExO?z zfJE$d4O~;yQbi?Izly6$eF!E0_{|Nxj8FI)3iy(&Wt?fy2O{W03=oWfI*Mc6AJ9oB zDHw1Wz`}-g4NDw+x(FpU-zj7T0xZfLM1lmVzUgxjf8Ryhk3df+!cpi5&0Ba zp%DdbTufktV{U{&TuOlx57lr$v&NOfFQHoW{lydg1_=0ei1g_*?5LEs?isv0WOo`I ze7oGGQP3fYOyI&mKFvs;c~S)s3ja4A9(3yQlP(S72dPa!Ol5<1k17*LxYAkj$2;P> z1L$pa9JR^c)|^?kgheiH>lzRhM_;=@>g<5^luP=YVWt8z8 z4jBVsU?fd$93DJzkGlfy zid(=g#(zC}sI{q=s|ac$tyC}auVV<|P3mv*s)`~m!2_WUYn-0(m(|}!W$(hP)a!^Q z+ZL~W3k`prE2q0LUHJrDj$`JywZrzMkj)@K?JL{9y|^I+mP|DsSy&BDC5p?!s%$)Q z*$o&66F&owfirrmgZzmS%Q<4=TqCqJTIgO}{t^#T3-iB^i{txTg?1S*t!v}x;Jr(o zC7F+dUJ))pwy)pQl3Lo9%t!k&l90f!;0^T`S$x2vAEm@N{sHGhsNl%ZPGoRD?*&m& z!*MHf_{i2jhX*^rfsg+FXBbx>YUdV>WibcelSqu=G^M{r?4lVB=0leu@mmQ)YzTSx{x z@?S1PI|y}@LxV9VG@eit$t!5>Fr$BfK7Py@X-6SwXfXfNoeZAG{RoITy6tdrhtdBb zM*nHHnFuls#2@Kl@X$LEOk8Nt`@6owxWA2Y|4q-hgV(IP=o>ggqT}e{6G-%!Mj}BW z_~tXDu_}TuDXNIP|1?x#qd(vjNg^q#Y#ba2AR1DGr}@~RX&y;%y*oki;tCpn0WSy| z?*KVI|978pTC^tyPwW352~vkj;2M__3oQIpI{Zg?>pyT6pOFsJje;1GMHwQldSZv+*s zYWbshgnvZaXsqXJUQ2!L2{Euv0YX=o3>t*oZJF!8n6AqT$R2TnuHt6rJ!>Lf%pClhlWD`W~wx0#j!l{IeQj5)YHQc zK4hnIB@Ei-i`2N)4^Sl0-q;Lv*vnFPw@;F7|BRCq)-9d^1mFhCHaV^K^Up6XOGl*k zuy2|rs(s9Bl-a6(#${|%T>m-hEEqHW(|u&1r0I_G(f`FC%o7TK^*t6pLQ&x#gMvo~ z#*@Tgqx~pz)Jn?xy!~Ys&#@5y4);e<)6=eEDk+M(f}-Hox)%kJA|F>|p^AJ=k&h@6 zvLaOp@+)GD*h`A*>{+`&L3}<~yV2%;Q7n~g7_k=U+AQxv+-f%>S9U2^%8l3~L&;Tf zq=;+O>H1QxTq+gncsKiFj~DO>uc7Gk{p?CJH1Go$^0OE4zsN7b!E;hfd_kqe7c`Xk zf^-5B}kIFdouqWLM$9!&hF?~7#s6% zdO8WXyoJ zDt$H|O-16Cc=sf&JI(cg!H!=pB0pe?1ad-=CV}J$L=EZC(XN|ZW#jO5{uWNX!Gpnd z98bjWbMZ&5oUc8qHj(Erf`o^lhNFlfzy+rb$4gFt*4BJ?85xl=&VmNw_(F1pbkSao z3rLMYnhQ=trVq2Ml27-=>;twXw97M~U^Rz7xeZdjDxaDETt z^pKxW-j7jt7?aS}2Uz*wsV89SlYQCLX$4`sxOH$Ap~P88SV8bS488KTP1%|AVA?-H zGt3wuN5&G86eQeDCNfwqGxJ6HtH`i$I6n#vXlH`~tK0R>E>jDL0hm()L{mU9cti=Y zKi)Igk%7CoJzaxLAsdbAEJy2glgS}%U}}3c5nbw6(CYqvj3;}hF?h`bycmShWqbsg zI16e7YQH8dov4^PSMus#q9Ic*Bm8WR`d6ILPg(4|A?gqDe2VkpiY2Ax&;S4>s4|tK z92y=dgeZUFVZj5PSE_!D8ubS(y26OV^`L84T5$Lw&V!P#RAz?5NM6f=DI23A4uVpo zA;jZ{>?V_pv%0#tt$ON`z{TTM9j(dF$fVCkF)RKe zo<65t9pfy!_i=&0>UQgf`YY@ZH&<_8eqDte@Ld*E%=K}d-Mpewq@HBaU_tVgUsO|j zctxd5|GL!)UY%s|MHUMz7Fje|C>BF3i1YeD=rFHFSulr5Gv6Yw?y~qA3sQ<^$T=K2 z!*9UgCkx1XwQu#ie2T5bDs<#uMD8Fgh)b`)=*G`*o_`3V7h*3+o>r zLJ7wH%})I^lwafJmK4T-aRv&g5CUyW;|hei3K1THDAypy!w}~Y(0LU4cnlIe4oR*< ziuXZ3Prv|A!XQt<5buXGd;o^|Ae`kxFv8EkIX(>M`B@m{BXEJAgNyt;jPX&p#4o^Q zei5$lF-Y@EaFt(%Yy1j~^E6EGt1!v0!F4_kH~0kH4GE6?-`$ic?e-U4-24Sy8s3( zVr$rou(YH8s0h}GnyX}Vsu>AC5fo5I;mU-M{qX8T%ZM#fOC zG^@L|)bm!^C@tsBTtO!DmRU4Uy5YQK6c>+Z?~ZV<*pW&I5oi;S!h{GRN{A8S1f9@F zz|ChzNkWRyPZ%H!5{3w82*ZT4gb~6y!g<0d;R4|zVT^EzaG7w0kS1IuTqBGVCJ2*+ z>x3JGn}iHuig1f?n=nn7A!G@62zLqh2=@sO2oDL52#*O*2u}%^dbU9sq95glGBb~t zOZIEbXX_JxP}@pd^_Z`EN=Fr%uhdn*T~08Pef4kZCk=N`kxC^Kl6uXp1-rLl%TTT9 zNgcORc4%pIu(+ZW!eHa^>bXJQFg`uTZw)wPA2t?oi~uLiEu%!0j_ZEZWA zv)ORIWcTdmUba#Dm~9<++fMWT%%g1gsc0Sitj|Ji!`pCnTQ9#M-)WB{N<D>I%BEh?h$OQ+~s0xMx+6KN&^5 z#pah5DcvQ!exF74#81OqSk9H+8l_*cOVO{MvWsHyqi2@f3F2>I7+AhogSES@(pG|v z#jX889c69RSH+aCf-=flw;|NVGS}9;kgs;I=c>QM-LF+b8#MuOsiV{t$`3R`0zu#f`k{weaFHP!db5C3IYLDqFF zE`5Oaw4-aN@eWgkv#g$gC^Fem+p!vJ$M>K4(FL}CudVyBddk;Pzt8UzKly$2ek{(h zj*5?OqMh^x{3OmL{e&O)le6s8PixE@^yBp*Dp>7Q5QT;kMKRZn0?QLW6~~$X8At4Q z$I<^aj)O73zdj6c%H=uM9te8m`yj4<8&^NOqvPuTRPg=8Y$$bFyN^~1a+e_KLy)g6 z){gE^_$kc67)BSZk3f>FM=xXVSm24(fAB@?={{&Oce0#K7OYU zQ~7K$Z42RuXX!~-mx_M)Y#i*(TGRe69bczw>gIR3X?|z=>3XlNtWRZ5O$IZBsf?gH ze>gloJsnh|uV0wy>BAu$wVUu?W7n}}ZP{KL9NSGd9gilxYOR^xbi{7eOYc_24wfrH zW#lkA>84+#CqXJ-1bsy^=cOvJ`ndhJ3^nYg)SMPFTC@y`N=94{oX?&Ne-Sm0 zv^^m;d%xyMP1seCVYk)5PL#@8twEo=C9_yE=5v-I!|21twhV6x=W|QU;hJd95uOcF z+p%$3GLFfU;aU^yeW`y-wYIlzwS|75V%@1VGed%knphzdl8#&TY2D}_}{hVcZ0 zjb@ec#;{e$S#PBF?HqM-%PY91Rxm6}Mwd!P4i7joY`j~=6HjQNSe8+opAVKV%$0KU z=uWBIMvZq}wU}8fccnO)>57S-t!^(|&KDL8sn6$2^Q+5?1>?O$-Nmx?CcjvgdMUs3 z=2%`RuFjzu@-$A)_twA&dTY>BSJZ<@x^klDW^X14t9Jth+7`3}SivV@mS1&33Fl$!th?>_s`F#g=w^EZb0 zH9YRmBZeUi+YqL03d^=cL_{l*ji?4N{`*c?_RqX?~clW1w;0f`$P)i!5z!)=Tv8yI>dDk*azf+@?nt{ zU7}m`h+c6(^sOZZ4Eyln0Xbj~inKf;2QM3PKpaHwQPG3+QBLl&9qLa!8(*XXLQV$`N^1j><7PF3-vH@&$Q8z9?UkFUwcttMa0J zO6R2 zQRl3*#VC5P>_y}+N?X2zu`P))F^;h;i*w>U-tVDodB^zFu=C;t`>W!DT@WwYE8-=4 z6(xD`GRBt|uP_|JIj?fgMb44v=QVLjye=+_D`G-i71wr>c2P{)Ybd!cZit)c^8wlw z<(hnecnR?(S&~w|jro-2tSn>X>kN4cklzxw#B)0q_wfd&-_&W$qk__DIU@z&YygLE z$qj~80jwCHI3>fbZe64K+%%S7u{Y&cWmRs9TLT6tqQLPtIljVi%nkXg9LEeV8&9l< zKfY(khdYL?ICQs`LTGcgxAnaA1ll76#G-{hdhME2)|KnFq46nJHFPW_H_qfb^!SuBpO?JDy5;x}F?XvLGrY zM`kl6H&e*0Nk^)Jhc@1Wf|prA@jB(Z9%37rYB962?MXLNa=dCP1k148@l0mg%Lutz z6)5)}$gpN%b+xKQ$yv*I)y(YF?AZAWue?a3N(t#nwNY}Y%&pecs>~Ei6>M?`Fp!C1 z0wUVWO^?RV9O_u5v@SCn5_1xn#}7)Y4`}SGg-S&VRN9mUPm0Pm^|vNH8cNEMTV95y zNi!%pn>8;pj5)5HJjwW(nz@zL;}7SL8N58^)ix`LJT7?;2#70F8**bsD)&+{TAwl`&F*p*>=d~-Xyuf{N=5R+;bxL!edH1}aueLR|3tyXFq4wk_YrB!r`fwnt9 z^9y=BdIFx?h9lA7{~k(JmDWm5p`x)gjP>Th(h2~%Skls(1M~u?8wC#-r?EY*s&(o* z9O_XTcw^?yovGY{#-hthv0B~OkPfZ4BQk5H zN2tZvotfogEOM&4sY#SbZc>O6(K_%7{z)43r=P#cVp(}bnXpZC8a6H zla-2_*{;??N@@~c=5fKz)LcDfP1QVSP5yd2jHl{H-ztpF5)R(Q;$PlG>{_Mxc)Y6C zChD7SJenKLOwA)$C~ahBiQHYpA5=F0`(CxC)3+2lxv2{4ax^o)UfRsusXAW4DX8jb zX0EWkQ3WF2lpc|aRA{b%o=i?w+^RF0xdZAi$V%o`6`SmH5)HCu5Cw*utQEv7)#`d} zGe};axs$)UaO+|YgFskl6HYJB9X-iC{p zt}IjT^2qSw*wW+i<+EA$Fgj{g9lm;L@zj!9a+dw)vq2(U)F9d9F+mUQ^i?n4#BE^Z zZU?CvSO_yK86=xa6Lc(4-n3J!er}?V&n*hT*Np7wt~tDGW_QiSU2}QYytHc~=k;Cl z?5;Vc5~#6jp4&D3UGwy=d3o2I*fp;N=J>8Tv}?Y$rzpyJm>HX;W>@R$MfEmdgL;iMkXc@jBu56^~kw%fOM^HUAwZ1 zA+-Kz#Mkh+83fXRP-Z|VgJ=f!9g$IpNzsoWHrO!{1M7~fZd6;P3DY0VIf~~79`|_! z!t{-@;c<8br_o`f0Z_=Zd{aa|F%KI663x{ULn1RgX&2wc4WT$uZl_8K2 zZwrorckr87BO+NM9%_+|s9|)>YnXQm8(5+|IBTV_DnVCKS5}I4cfoP09`V{dHTeTW zjiSl!#JRgJ==@w^LlhpB1gP|!kdMx7KB#)tVx{`{+#~5cI#(&JoZIA6>BaF^&NT@E zj1wJEPb!}mH2pXN!|XRLv)3uS~lLK~xuMy?UIZmAQ5CNHucS0}s(#g714 zR5}lV8E7+e*{GhYH8UH;HI{+{Q}-utEaVqv-kQqg7v7znn$Mc*Ea37SbwI**kYXOk z2q+<~$7}VQDXZS!9&fu+E*qyA5=!&=AeGN=fE89Kp3dhV)(RC}qQ(h$5{wdi)Z11U zp6;3ut*C!ZIEc7JFiA5Rs~=@{spk6 zQHeTE!9fH>8|5lz`A!3&gg z;QV5BrkOMLDrG&3hUdBQ`Rs_l_`=w0t@78Fvm@F1(M376yf}7tnV~;bSkF?2Ph~BQ z6EohQo4r~;xHSHS?D~N(W*z!M)?)c9%k?OQEnLTd8rqmQ2w4sSA|K*uA|~Q%@dj2_ zB-YFwvte%Kd=letHLR^`o(YC!?U+bkXhgO~k&cL@==jL+BR4^MpHj{KM$|XUQIROe z{OAr~n8w4e+%q1Y$CJ5d_$KyjDi@e5fvEzs7MMlbT2Z!DRKXWH=sXQ@5WyNqZMnB$ z`uLTN9q`cKu^vX}HG$C?2&%@yb048##&C@iW-s&QpU4lQf*;C#kdvk%t;4 zX-x5@k)@FRW(HOPcAMm z4rkwQEZ1Y2tHhVa=~quIUV43e^xAU$*e@B^u6d?@?3ave*F0HIh5X82vOiCv%hoQoY)YxB%0VJ{5jE6H6ue9UA42VbkE3@`@Mm~QW|EQfA#)71BG~`tF6)~>5rIoi(!9+gl{fc z4XY9HNs2Vq4fk{yv($u7Vv@OTs0j}uYnkd$4rWv~cfgWAGTqH)H{VrO){AVaVQpWK~?WkL7c8QjzDD+-GUf*7DRw_ zI|6*$Da7*CViBy_P9Y{l7KAoiYe8NDX+RdD^U_)~8WCYOqEF1Ne&4!jJTaG3jTl7#*bYbw^6W*R z((+?CM=jHsHT>98tPyV{8p%dSBjv{->00U?KY=BPJ{&|khV)laFYd(=d*nyT2|vN7 z>Y!6WZW6h_i`))UB>5dnAc%YlPv^ry=QhgIURTkA^!)oG(ug{ju;BmRkI*9$M~p_N zpA^v}bT#SRG1p`2rx;x~dO*qya|ssB2qis!lJdhkJc_+N?&)pN#|@~Q646&7*5^|q zrbh&2TfE#$?RQ8HNak*-USM*ey~ETb(x3lN{ACXWQ95mdNJTn9oQ@yRMHha-@X zB=uKV!EtDnydVKh4rwxi4yHT0VyQc5V$;Q#Zwx_{cVx z1^!ZaT7>$SNDzTy0l*7LP!lE=AJ;1)kp_4`Bfj-R5BY205j!B?<-gkixe4%uU&qA@ zJO^azCz&Yc{0=N?{NXs#2`}k&c&TC(gjV)DXxX`5Cy4VSKdwFyQNLpVc>=`lM5!ON zN~83zgLF;5g9&=vnLutAa{myy-9*q2$DI-6g(Fn|2<>CeAUM)bK*T@sqneDVHDE&E zY(fH|5r<0VnBizDQ}1E=A*o43vpt#&h-%aZ1xy-*tvzHG%}w5!3gWrDcdmodVw3al z=5FA1Z*qDeh|e#~K_8{c)MTB43W97(-!$neqDZ<{bfL04K`U-vb2LSlAUj1|GQ6-x zP-@fJ;?y?y4aspo{X9UULGT)vu2u$9NUs^S`oOxFb}YOjL{&&xQL9ZwO&TI}<*~EU~U>QB=4MJ3_sOvq$8KorgR&^i2Px0_+mb8-bWLI*Cb6dwPkz(t(9YMl_ z08gSkiKN6c5wnE3-l1@a;kZJIb4gIO3O#6!o$a`EFfpiS+S*7?%;KHAnxQ-xwlxllw? zNye2AYXAXFbj>3@^a?4eQ2>o86y6#9O%01Py{s_fKqVZWj(8g0FtRmQiB&6M%5u5I+}7R@StR7v*1D{ zI?5x_mk`21I1}iJH=%|MXE9f;IbsZIqK_B)y$EPiB!v-0eEBuRJ1O2QNQRLyovo{k?WXtC z83Ure2H@)J6nuyP89Njw;adGVX9O{5J0X80Ld9v2VmZL2y_vP_Bw1WYB~B;*evL!W zo8LFf`-FD7iW`wZNSwr^=`dHnft(ipNexbiPy~-lY;`;RG4y(6^PA>9!x@a?tX@y4 z=S`f9IPsACuHjhsarS)^Dd?0V4eJ|L(IiFAN6ALy8^$-xq9x)YffUY4uw6*=<%ow{ zfZ7zvZ$kVO9m1sb#p#~{D~`Fo4eU0(j#-GsAEeyvA8&Qz&>-+n7Vf z2;SvP^_q)=S-KCZwTfV9;H&NGyoU?>jta6=YLg+1%(W7jVWtZ6VnMCdh;NU!_Vy?P zBwm3Ly3qS(9v8MVFaS}y$$K!=mgP0%pE!Y-J&|3r1q{r4qp(%lsIe*5dkiHk7&`7q z`j~inQZxhZd>FkILIXgSs~4aT#=!u?9W<(}8+J3p6u0aCp06VE}MW+$>OvXqyA%01Hsq#_-FdTeJj z^MMWZ3|Ui~XL=K-#f*akI<$IIg%&>eq}8M&WU&CHAFY`NccwipmQ*k?9(wLp$n#dg z09t><77pTZGYGchAA=pwgI9Y77{bveLzp+f42a!YIl5?&%D;=0GShUgp?$;$0&Nt69)|hf6_RA7&1B!iVD7GNBoHU4$ahy z(~TI162Xmbr@bU;of|Rqa0xwhpoj139vFI3eTKVe6ju?;N#ibxUQquF{d{bwpZQV9 zq!IO}VY?rS1lpuTlG>n$*2qw=1J@m>Qh@hVu6bUaA)yJ%U)neuC6{H*7Ky+fT`A}l zsdv8LV2R}Y=Tw95!S%kHv+h(Mw|Cp6O#PYtd95~=GVeF)11-?dL*oLwaY@s1y-k*3 z!Jc;dV2zG}tf4B4Ya@Ap`$35~=1ukl;r*w+iuDUR_w2}^LvLf4`T`hU;84H^8QXqT zglpes+cmd`0>?w1-AT9OP#YdZHrzG!SCGvTj2)vsSE01*0ISIJ-V2h%q{*PRhe|t( zxLiXSO-$tLM5M0(gkf6IZV)M*s<;?KFRriF7N>C1TBK&{wos01Q5@xTxvoF|r6j$l zlLd7E9n?EoEFha83m})|7AR=q>3H{P zt<0hupPn@74e$dZ5CalW%W7>_G6)faxq-(eoiCa8uvH=HZJ&p7h_7U!#*vIZ*pg5W zK~Lbb+2|9fmS|h$@yxSq0ws}Ij?)ePLnD+?$j2#Bzdr+w9yl#K3gJ-Y(}`~?Fr?C< z-Mo{v2wJZZU!a&h?pw3rtmc|9XRPpLe*x^Rn+a{DRxC<#gHaQh5-zzxSAL~dsz83s zlZS;OBr;CPA}-ezp&^LUK;TqSsk$;7W4s4(4N9+DjDWkav%?QV6K4B5Oak;D)3Wp< zVnkD{*hzsh3GJlDQB&O(j8wlw%ovkq&Rj zU@Pzvfb>M?F^fmImrGTIqBRtf7)Fg0kfK`@wAh%PB)mU}D@2g9252 zSy!R!+!wlmLUn&942tAP8jN0cCnUu7@W}Iv4-inmLbIOMe2{R4iVUVwT`OVj8O-Y# zgM;<1v6K`F)TA&eIjfZ#v_+w)N8o;;GKfX}LIqa?$lsv+FLcybi$q=fv|^sc=ZEsgq{QR+2$EY57<2xIYHV6J`|h7alq` zz|O>TU~sU32&0h{P(4FUY&2jyXpr3@jdvFm3nUrd*J=lKOT-(dNA?L*oD`?P3}f%$ zsCkmu8r+8M1J~T{J=f(ALJ2d`=+;M32<UK=*O6nKFVP}?59ihfZ-p& zmAJoX`ANSU&e}Xq@qBx}PSH;Q&I;NL34_{*&h`iB!e$9l-5MXL(FGU-8V2eNP|X(B!defPsGgUmc06bFeuT%>YR5f%v7LVihK@5w zjP)om3Cml#+dsr&k>T|)1@zErg0i4C3C9`sx%G(K4x=rt0;kp!h>d!^qF)@M+J1Kt z_Y%+>_JYW=f~LdoM4kJ78hImV8>1BO66_G#DVWIt7;jrRY2yNp?iMgl?Z4-DaY#_k zhETq@7YfWP-A^L!AA#n9Um87)1Mo4=tv?EBB%vIy&%>(FZt!~`lnnZVPZH{yKUnS; zuo8m8k2GKb^^frEX$SO2U^5fi9Vz1=l=2XfH=BiVkbr2KlKK&R@BpfZ1)6M z>8D{agyY^3j4Y-UFnH8Iegpzuqfhe{#w2l;m|AFZ7GR6;!_?HE@g*6iUgeOYoTD1k zjRRCyQ!aLYcOy9qu1MJMj!~cPcYrrTqzKnf<)m9Van+AHquBjNG0zz0$!pj+K%*@m z_n+A@pTstQ#_{7KNu%GBPEnfY(;A0JVm-m#^=O>F)(rNoSNWM8<4Iio1$rODSmSCA zm`8}K$Z>HDV~N9|;e=y(&+fx1CTtMew(&thH)MHEP%kJ@mz&SQ2-O({2xBjl6|L$R#FrZ+M{YnfR>F57kmI$~ z%6H*|BS;>ycAksa^9_-Rer!U##H^6tdK3L>2cC_%w%RCsK{V z2m%|KE)QipiOWDeb-5`AP1KM5qCvn?L3&{I96GH>#>dAO0y7oF3hp*E{;|U20z3pF zxWVt5OZCX`;`{YTcDa$Yc+O4v3_?-pH)L^EGk>y~|M}11=sgFBmPt61!4h0N*6O-S-iMLx2jwPGnBGHntitQ@xC1Bttdr;sJ3poC4L zuSe9VP4@{He%uFW)WOT2$FkeKttgzeXsC9&o#Rw^ROEx=LeW*&vXkh5%||xR8y|An zgek2$qje$=7y5w6?t)F8C{GLOcHF7t0mbgzWTfi`G;bT2M}AZyROD+w4lDSU27UwY zBc*B->=V_$i@d)CRk~#&O(@4mVFtxSgtSEXK`)eql8nq#7PLk1Fkvr(BvfatH$ooi zg8SgmPaX#&NcXo}Lb29o#tjQO+B=16LiJ&hcMDV@7OCj^P!@;7YPWgRI$;iSZpu6f z9|lsEP|Y;l@AYUh)=`edBh+gY?a4{28?8vecNl8C6Xs#WNx4V*t$yksGf1Hqokw-Z zSBA7$;>p*hFXRD;HrOc2ao#A)_ao1j_9q5hirlm{rG`j8EGtWeZG7Nkz3A7O;X z(T_Atd|{0~Gh-^kdrRp0E^3zkfZ2tIH)5 z2efI_FW|^NBnBYV42VGzbs(O0Hqy|ZQ9gX2phfHSaS7Oon1Jyv#!8~%2Pus9KLOfd zhW51(+DH@H{{fWW1C#-V^0z}Mz0^AyAHLAz7U~Xi-G3d{?WVdk$9-eVq2>{;`Cs%U z7q~e>^>ER>fU=_~v((8DO8>_Y>im?()`$CHksX;#N5}O+{uH^ADtn$NsSg2>D}4$e z%ug`((A)&2Ym}5<*+>xEgw7R*qr2_W_c#I!9Hog3>B6`ds`6Xf1NgwBysCcICgghm z2EJ!&o0oKjmPZ?ng&v}Am(C*}GxW_ObkPGCS&^=X5zG`Gta_#nO4UW=z|jch`1*=4 z@qH!ui0n_27_uX-Lq&3=i;9X2`8~A#+c%qgBGv3{L5Pitz++pf7pw z(fDUbX#H`LJ}DskTM&hT*~RAm5tX&E5MxMxPDo%M0k9EfL0}_kvwrYtgmB$@pZ@$R zGZuP9;Y26reJBpsw6WlIbWw-7M4M3XX;%FV>Bv~uN_y4MY3X&C-Ptk;%~%!E7d}RX zn{yN@UC)l;E5Fyy0a%F*e4IJkSZzN1`@-BdQ8qN!4V17-n32 zY8LuMWynH8*88S{ksGkW5>6NYk`NXL1Ts$kn2_=}XxNF%JdlZcdPs~8i7^f@)q94< zE}VCV#$I@t1I1|9_L(%RomFiUvPG)iUxV%ydQEa6YAq71qPgs`Ac;9aB5fcbi zKS5x}d6Y^+Vk6NtDq{y%MHTd?;_R==K8VuE!<}wT!fi$24oa1ONC6RJlQ72+ham*p z@Fzr)IV9n)8c9aFJJUGl$U~LhNz39>E{(Gso~#jl630QhQJl>x39p!NLPiF5GylY}8SIfbO(D^bLy5P(XW?1t&F&7`b-dn4VUjQSP@X z10$l(gYtF~pAgcAg!5Wb<|XW;YIMlj(c80=b9Qu&!`t(3Uq_t6*o~RnGdX(Qxie`; z=cn#W+tJzEcjxWco#`B2(fI{5jLqMkoPX1fzH^-tlXqsP0PObE{JfobV{U440m<0Z z+jl2#+mV|y3w8qKH{jlE$8TSso4he)$LI7rG4-~tmdwp8=vW7V(b04WOQ&KB)31c{) zqT}gsm|+P|D{Md$)zO}I|2m_)HHff6dn92-dpJ6yGt6Kd_U=h=abQgXW56NdPrX2k znj&r__lTWAumyInN~A(ul1dPow%VTaXUV}27fhaM{{Uwcf2XLwC|Ek2(}%##(UP_bjTYL2swF;=iM`HE-9^b6>4JV3D1`u;Zs^Jl?Te~)nY#|W@t z;Lw9_=+rIB`iB(!0}Ad?z#q7Mg<{{M;3pI?)OFzyV?@D{qLDOM4lyfcSIn|-3E@jkH?AIZ{b~JhP5J-vOGXB} zxQ{4ZY6fwwpf~-p?K6xzJnOsixCXXk7&2Z5Aa?1Q)e0S2x literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/types.cpython-36.pyc b/venv/lib/python3.6/__pycache__/types.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6337696db6e198e954790d7cc2f3a076cafe5310 GIT binary patch literal 8233 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/warnings.cpython-36.pyc b/venv/lib/python3.6/__pycache__/warnings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..966c58617b8b87e294243f1b5497339472836a96 GIT binary patch literal 13290 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/__pycache__/weakref.cpython-36.pyc b/venv/lib/python3.6/__pycache__/weakref.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b97fdb34a99acf05bff55a7c77f024e6d002e53 GIT binary patch literal 19175 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 C0^Onj literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/distutils/distutils.cfg b/venv/lib/python3.6/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/no-global-site-packages.txt b/venv/lib/python3.6/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.6/orig-prefix.txt b/venv/lib/python3.6/orig-prefix.txt new file mode 100644 index 0000000..3dcf109 --- /dev/null +++ b/venv/lib/python3.6/orig-prefix.txt @@ -0,0 +1 @@ +/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6 \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc b/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efe6a6060d420d5a71e562be3a47beae63eb19e8 GIT binary patch literal 327 zcmYj~Jx;_h5QXg|K!n&6AVEZzVq;d>5DJ87C}=1EA(6&1v9kpH6Kp5SZb8FoI0P3- zOT`taZ~y^MdT(Z=(f88HWHY>ey?FuvygC2MbK8lt*>gcb0T`t4!P7g`qdxb9U-%F( z{~16)gG&&vt+p>(8QD7)of5M=lg1Lxqf!Y$BppJG1*s**?+yoII0WN)9tXn)##EIU zk1vu4hHu;*|9peS)bvM4^qe6|YJ7O8?h(?v-lxc%zIXaxD zy?yNadCs$DG3&B2JCHgR`%Vjqu254q)7!S@bZV=d-&ZS*{@T(1)}&bu;gL|Z`_ +tool for installing Python packages. + +* `Installation `_ +* `Documentation `_ +* `Changelog `_ +* `Github Page `_ +* `Issue Tracking `_ +* `User mailing list `_ +* `Dev mailing list `_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.python.org/pypi/pip + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=stable + :target: https://pip.pypa.io/en/stable + +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`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA new file mode 100644 index 0000000..600a905 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA @@ -0,0 +1,69 @@ +Metadata-Version: 2.0 +Name: pip +Version: 9.0.1 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: python-virtualenv@groups.google.com +License: MIT +Keywords: easy_install distutils setuptools egg virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* +Provides-Extra: testing +Requires-Dist: mock; extra == 'testing' +Requires-Dist: pretend; extra == 'testing' +Requires-Dist: pytest; extra == 'testing' +Requires-Dist: scripttest (>=1.3); extra == 'testing' +Requires-Dist: virtualenv (>=1.10); extra == 'testing' + +pip +=== + +The `PyPA recommended +`_ +tool for installing Python packages. + +* `Installation `_ +* `Documentation `_ +* `Changelog `_ +* `Github Page `_ +* `Issue Tracking `_ +* `User mailing list `_ +* `Dev mailing list `_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.python.org/pypi/pip + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=stable + :target: https://pip.pypa.io/en/stable + +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`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD new file mode 100644 index 0000000..fe115cd --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD @@ -0,0 +1,501 @@ +pip/__init__.py,sha256=00QWSreEBjb8Y8sPs8HeqgLXSB-3UrONJxo4J5APxEc,11348 +pip/__main__.py,sha256=V6Kh-IEDEFpt1cahRE6MajUF_14qJR_Qsvn4MjWZXzE,584 +pip/basecommand.py,sha256=TTlmZesQ4Vuxcto2KqwZGmgmN5ioHEl_DeFev9ie_SA,11910 +pip/baseparser.py,sha256=AKMOeF3fTrRroiv0DmTQbdiLW0DQux2KqGC_dJJB9d0,10465 +pip/cmdoptions.py,sha256=8JCcF2kKAF2cFnV77oW-3DsHJifr9jF2WuChzzwgcwg,16474 +pip/download.py,sha256=rA0wbmqC2n9ejX481YJSidmKgQqQDjdaxkHkHlAN68k,32171 +pip/exceptions.py,sha256=BvqH-Jw3tP2b-2IJ2kjrQemOAPMqKrQMLRIZHZQpJXk,8121 +pip/index.py,sha256=L6UhtAEZc2qw7BqfQrkPQcw2gCgEw3GukLRSA95BNyI,39950 +pip/locations.py,sha256=9rJRlgonC6QC2zGDIn_7mXaoZ9_tF_IHM2BQhWVRgbo,5626 +pip/pep425tags.py,sha256=q3kec4f6NHszuGYIhGIbVvs896D06uJAnKFgJ_wce44,10980 +pip/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/wheel.py,sha256=QSWmGs2ui-n4UMWm0JUY6aMCcwNKungVzbWsxI9KlJQ,32010 +pip/_vendor/__init__.py,sha256=WaaSJ3roSSJ_Uv4yKAxlGohKEH9YUA3aIh1Xg2IjfgU,4670 +pip/_vendor/appdirs.py,sha256=-9UOIZy62ahCQVY9-b7Nn6_5_4Y6ooHnv72tM8iHi9Y,22368 +pip/_vendor/distro.py,sha256=A4Douw9pcqdYxDTp5b-OR02fxVXnfWs-wC1wA89rhRk,38349 +pip/_vendor/ipaddress.py,sha256=wimbqcE7rwwETlucn8A_4Qd_-NKXPOBcNxJHarUoXng,80176 +pip/_vendor/ordereddict.py,sha256=4KsFuc6V8IgHROCHUu-4vCrr21ZPPea7Z0cvX9AjQ7w,4094 +pip/_vendor/pyparsing.py,sha256=7vAuUVbh6txUKQR2IzJ8_9DKmD5vtm5MDssWkI0ka8o,224171 +pip/_vendor/re-vendor.py,sha256=PcdZ40d0ohMsdJmA4t0AeAWbPXi1tFsvAwA5KE5FGeY,773 +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/cachecontrol/__init__.py,sha256=UPyFlz0dIjxusu5ITig9UDFJdSY5LTwijhldn0AfyzU,302 +pip/_vendor/cachecontrol/_cmd.py,sha256=MPxZfZd2LKDzVrs55X3wA1rsI2YuP8evLZSwQj0dIk0,1320 +pip/_vendor/cachecontrol/adapter.py,sha256=RaGYyRA-RA1J0AnE67GzEYFPBu4YH4EQUvQqTKa57iM,4608 +pip/_vendor/cachecontrol/cache.py,sha256=xtl-V-pr9KSt9VvFDRCB9yrHPEvqvbk-5M1vAInZb5k,790 +pip/_vendor/cachecontrol/compat.py,sha256=uyovOpd1ehI3J1XeBqJvcsIp6fvkjBpoQmu_0J2st8c,416 +pip/_vendor/cachecontrol/controller.py,sha256=elDsLcaYA15ncodRmHnWQp6ekU_ocEGtDeGLbsnTjzo,13024 +pip/_vendor/cachecontrol/filewrapper.py,sha256=_K8cStmXqD33m15PfsQ8rlpo6FfXjVbKmjvLXyICRgI,2531 +pip/_vendor/cachecontrol/heuristics.py,sha256=WtJrVsyWjpP9WoUiDVdTZZRNBCz5ZVptaQpYnqofDQU,4141 +pip/_vendor/cachecontrol/serialize.py,sha256=XM6elG9DSNexwaOCgMjUtfrHHW5NAB6TSbIf3x235xs,6536 +pip/_vendor/cachecontrol/wrapper.py,sha256=Kqyu_3TW_54XDudha4-HF21vyEOAJ4ZnRXFysTiLmXA,498 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=uWnUtyMvHY_LULaL_4_IR1F_xPgK5zHfJyRnBq4DnPE,369 +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=FsDug3bwUAQ3okjjfGzxlDaBf2fwVSn1iBKMTL6SyGU,3532 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=XywqxkS9MkCaflTOY_wjrE02neKdywB9YwlOBbP7Ywc,973 +pip/_vendor/colorama/__init__.py,sha256=9xByrTvk9upkL5NGV5It2Eje4-kzNLwa_1lGPWpXoNU,240 +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansitowin32.py,sha256=gJZB35Lbdjatykd2zrUUnokMzkvcFgscyn_tNxxMFHA,9668 +pip/_vendor/colorama/initialise.py,sha256=cHqVJtb82OG7HUCxvQ2joG7N_CoxbIKbI_fgryZkj20,1917 +pip/_vendor/colorama/win32.py,sha256=_SCEoTK_GA2tU1nhbayKKac-v9Jn98lCPIFOeFMGCHQ,5365 +pip/_vendor/colorama/winterm.py,sha256=V7U7ojwG1q4n6PKripjEvW_htYQi5ueXSM3LUUoqqDY,6290 +pip/_vendor/distlib/__init__.py,sha256=-aUeNNCfiIG_1Tqf19BH0xLNuBKGX1I7lNhcLYgFUEA,581 +pip/_vendor/distlib/compat.py,sha256=FzKlP9dNUMH-j_1LCVnjgx6KgUbpnRjTjYkTkDYRPlI,40801 +pip/_vendor/distlib/database.py,sha256=jniJmYk0Mj2t6gZYbnn68TvQwnVZ0kXyeuf_3AxFclk,49672 +pip/_vendor/distlib/index.py,sha256=Cw8gxFq_7xXvdgExL3efjLAY3EAPDMSL3VA42RkbQBs,21085 +pip/_vendor/distlib/locators.py,sha256=hD_Hm3aSL9DklY9Cxyct2n_74gZ0xNFFGB5L7M6ds14,51013 +pip/_vendor/distlib/manifest.py,sha256=3qEuZhHlDbvyYZ1BZbdapDAivgMgUwWpZ00cmXqcn18,14810 +pip/_vendor/distlib/markers.py,sha256=iRrVWwpyVwjkKJSX8NEQ92_MRMwpROcfNGKCD-Ch1QM,6282 +pip/_vendor/distlib/metadata.py,sha256=hUsf7Qh2Ae4CCkL33qK8ppwC8ZTzT7ep6Hj9RKpijKU,38833 +pip/_vendor/distlib/resources.py,sha256=VFBVbFqLVqDBSQDXcFQHrX1KEcuoDxTK699Ydi_beyc,10766 +pip/_vendor/distlib/scripts.py,sha256=xpehNfISGPTNxQZu02K9Rw2QbNx_2Q4emePv3W5X0iw,15224 +pip/_vendor/distlib/t32.exe,sha256=cp0UAUDDr1tGAx8adlKxWbCHIa-oB3bxev5zYzgAr8E,89088 +pip/_vendor/distlib/t64.exe,sha256=FiljDPcX9qvoe9FYE_9pNEHqbqMnhcCOuI_oLJ4F9F8,97792 +pip/_vendor/distlib/util.py,sha256=E2wU-RZShPMFUMJr9kPmemTULinM4qDzosNPihCuKE0,52991 +pip/_vendor/distlib/version.py,sha256=CgghOUylxGD7dEA2S3MvWjx7mY_2bWsluF0Of3Yxl4Y,23711 +pip/_vendor/distlib/w32.exe,sha256=LItrBJesEqt2QTQuB-yha2YbMegURHmHmdSxhjBqmnc,85504 +pip/_vendor/distlib/w64.exe,sha256=n_PioBC7ltz7sAk1WLbLzZJgS4R2axSy_0HPf8ZCsEg,94208 +pip/_vendor/distlib/wheel.py,sha256=UP53cKxOM5r7bHSS-n5prF6hwJEVsMW9ZNJutOuC26c,39115 +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +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=eSEyJg7jxF_eHlHG8IOtl93kb07UoMIRp1wYsPeGi9k,26955 +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/html5lib/__init__.py,sha256=JsIwmFldk-9raBadPSTS74JrfmJvozc-3aekMi7Hr9s,780 +pip/_vendor/html5lib/_ihatexml.py,sha256=tzXygYmisUmiEUt2v7E1Ab50AKQsrD-SglPRnY75vME,16705 +pip/_vendor/html5lib/_inputstream.py,sha256=C4lX5gUBwebOWy41hYP2ZBpkPVNvxk_hZBm3OVyPZM4,32532 +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_utils.py,sha256=bS6THVlL8ZyTcI6CIxiM6xxuHsE8i1j5Ogd3Ha1G84U,4096 +pip/_vendor/html5lib/constants.py,sha256=Dfc1Fv3_9frktgWjg4tbj-CjMMp02Ko9qMe4il1BVdo,83387 +pip/_vendor/html5lib/html5parser.py,sha256=Dmlu9hlq5w_id6mBZyY_sE5LukIACgvG4kpgIsded8Q,117170 +pip/_vendor/html5lib/serializer.py,sha256=Urrsa0cPPLqNX-UbJWS2gUhs_06qVbNxZvUnrmGZK6E,14177 +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/_base.py,sha256=6P_AcIoGjtwB2qAlhV8H4VP-ztQxoXFGwt4NyMqG_Kw,979 +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=DXv-P2vdQ5F3OTWM6QZ6KhyDlAWm90pbfrD1Bk9D_l0,621 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=2Q_JnMscn_tNbV_qpgYN_5M3PnBGfmuvECMKDExHUcY,2742 +pip/_vendor/html5lib/filters/lint.py,sha256=qf5cLrT6xXd8V7GH1R_3lKxIjuJSfpbWTpSwaglYdDw,3365 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=EHig4kM-QiLjuxVJ3FAAFNy-10k4aV6HJbQzHKZ_3u8,10534 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=7PqJrhm6mo3JvaHk2IQW7i74Or7Qtd-FV8UftJIyDys,25112 +pip/_vendor/html5lib/filters/whitespace.py,sha256=KPt067nYTqqi8KLTClyynn4eVzNDC_-MApXNVHRXVX0,1139 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=l3LcqMSEyoh99Jh_eWjGexHnIvKhLAXoP-LDz88whuM,208 +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=6VIuHDNoExv1JWv3ePj6V5CM-tcyiUSWe5_Hd2ejbwY,1555 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=3of4vvaUYIAic7pngebwJV24hpOS7Zg9ggJa_WQegy4,1661 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=UlB4orkTgZhFIKQdXrtiWn9cpKSsuhnOQOIHeD0Fv4k,3406 +pip/_vendor/html5lib/treebuilders/base.py,sha256=4vdjm_Z2f_GTQBwKnWlrzVcctTb-K5sfN8pXDaWODiA,13942 +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=CEgwHMIQZvIDFAqct4kqPkVtyKIm9efHFq_VeExEPCA,14161 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=CFpUOCfLuhAgVJ8NYk9wviCu1khYnv7XRStvyzU1Fws,5544 +pip/_vendor/html5lib/treewalkers/base.py,sha256=ei-2cFbNFd0gRjyaFmxnxZGLNID4o0bHFCH9bMyZ5Bk,4939 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=8jVLEY2FjgN4RFugwhAh44l9ScVYoDStQFCnlPwvafI,4684 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 +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/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pip/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pip/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pip/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pip/_vendor/packaging/markers.py,sha256=mtg2nphJE1oQO39g1DgsdPsMO-guBBClpR-AEYFrbMg,8230 +pip/_vendor/packaging/requirements.py,sha256=SD7dVJGjdPUqtoHb47qwK6wWJTQd-ZXWjxpJg83UcBA,4327 +pip/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pip/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pip/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pip/_vendor/pkg_resources/__init__.py,sha256=CcwuHtCBZn9OTkmgF9cFpadIAMhlrnZTVKTOo4V2p58,103230 +pip/_vendor/progress/__init__.py,sha256=Wn1074LUDZovd4zfoVYojnPBgOc6ctHbQX7rp_p8lRA,3023 +pip/_vendor/progress/bar.py,sha256=YNPJeRrwYVKFO2nyaEwsQjYByamMWTgJMvQO1NpD-AY,2685 +pip/_vendor/progress/counter.py,sha256=kEqA8jWEdwrc6P_9VaRx7bjOHwk9gxl-Q9oVbQ08v5c,1502 +pip/_vendor/progress/helpers.py,sha256=FehfwZTv-5cCfsbcMlvlUkm3xZ0cRhsev6XVpmeTF4c,2854 +pip/_vendor/progress/spinner.py,sha256=iCVtUQbaJUFHTjn1ZLPQLPYeao4lC9aXAa_HxIeUK6k,1314 +pip/_vendor/requests/__init__.py,sha256=Cde-qxOWcslaEcPvKAJQPFbY8_va8PMbU7Rssr7vViI,2326 +pip/_vendor/requests/adapters.py,sha256=DJdgax91PyS2s6_oZPELbuLWNlM2xGguNu62sqcOUik,19740 +pip/_vendor/requests/api.py,sha256=PgminOpD8hLLKLNs0RWLKr1HpNc4Qxr_6uen8q2c9CI,5794 +pip/_vendor/requests/auth.py,sha256=eBLtJlcTZxRG7xKXCvGQBLO9a-PxFgMf2qTUbtZwMJM,8175 +pip/_vendor/requests/cacert.pem,sha256=5xzWFRrSP0ZsXiW6emg8UQ_w497lT4qWCv32OO8R1ME,344712 +pip/_vendor/requests/certs.py,sha256=Aa-oStu9f2lVi8VM9Aw1xaAtTIz7bhu5CGKNPEW1waM,625 +pip/_vendor/requests/compat.py,sha256=0cgWB43LEX5OrX1O4k-bPbFlIbWXgEd412DSDJtF1Y8,1687 +pip/_vendor/requests/cookies.py,sha256=awMI0hm3SKheMEDTqO8AIadc2XmnCGKPCTNw_4hlM3Q,18208 +pip/_vendor/requests/exceptions.py,sha256=x-MGvDASYKSstuCNYTA5IT_EAcxTp5knE3WPMrgkrlI,2860 +pip/_vendor/requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 +pip/_vendor/requests/models.py,sha256=YHuL2khGDFxeWc-NMJIcfFqvYJ0dKs1mXfj1Fuff1J8,30532 +pip/_vendor/requests/sessions.py,sha256=H7HpKRLKeu1MSH5W1-PI2GMCFLN4bz5i3OFqjjgzE5k,25609 +pip/_vendor/requests/status_codes.py,sha256=uwVHcMPkHV3FElDLlnDTH3KULZIAGxaovbBxrjWm8N0,3316 +pip/_vendor/requests/structures.py,sha256=yexCvWbX40M6E8mLQOpAGZZ-ZoAnyaT2dni-Bp-b42g,3012 +pip/_vendor/requests/utils.py,sha256=9d3jqnA8avsF9N1QPmsk2pJgo2pxuExrN2hoIhtLggY,24163 +pip/_vendor/requests/packages/__init__.py,sha256=CVheqNRcXIkAi5037RhxeqbAqd0QhrK1o9R9kS2xvuI,1384 +pip/_vendor/requests/packages/chardet/__init__.py,sha256=XuTKCYOR7JwsoHxqZTYH86LVyMDbDI3s1s0W_qoGEBM,1295 +pip/_vendor/requests/packages/chardet/big5freq.py,sha256=D8oTdz-GM7Jg8TsaWJDm65vM_OLHC3xub6qUJ3rOgsQ,82594 +pip/_vendor/requests/packages/chardet/big5prober.py,sha256=XX96C--6WKYW36mL-z7pJSAtc169Z8ZImByCP4pEN9A,1684 +pip/_vendor/requests/packages/chardet/chardetect.py,sha256=f4299UZG6uWd3i3r_N0OdrFj2sA9JFI54PAmDLAFmWA,2504 +pip/_vendor/requests/packages/chardet/chardistribution.py,sha256=cUARQFr1oTLXeJCDQrDRkUP778AvSMzhSCnG8VLCV58,9226 +pip/_vendor/requests/packages/chardet/charsetgroupprober.py,sha256=0lKk7VE516fgMw119tNefFqLOxKfIE9WfdkpIT69OKU,3791 +pip/_vendor/requests/packages/chardet/charsetprober.py,sha256=Z48o2KiOj23FNqYH8FqzhH5m1qdm3rI8DcTm2Yqtklg,1902 +pip/_vendor/requests/packages/chardet/codingstatemachine.py,sha256=E85rYhHVMw9xDEJVgiQhp0OnLGr6i2r8_7QOWMKTH08,2318 +pip/_vendor/requests/packages/chardet/compat.py,sha256=5mm6yrHwef1JEG5OxkPJlSq5lkjLVpEGh3iPgFBkpkM,1157 +pip/_vendor/requests/packages/chardet/constants.py,sha256=-UnY8U7EP7z9fTyd09yq35BEkSFEAUAiv9ohd1DW1s4,1335 +pip/_vendor/requests/packages/chardet/cp949prober.py,sha256=FMvdLyB7fejPXRsTbca7LK1P3RUvvssmjUNyaEfz8zY,1782 +pip/_vendor/requests/packages/chardet/escprober.py,sha256=q5TcQKeVq31WxrW7Sv8yjpZkjEoaHO8S92EJZ9hodys,3187 +pip/_vendor/requests/packages/chardet/escsm.py,sha256=7iljEKN8lXTh8JFXPUSwlibMno6R6ksq4evLxbkzfro,7839 +pip/_vendor/requests/packages/chardet/eucjpprober.py,sha256=5IpfSEjAb7h3hcGMd6dkU80O900C2N6xku28rdYFKuc,3678 +pip/_vendor/requests/packages/chardet/euckrfreq.py,sha256=T5saK5mImySG5ygQPtsp6o2uKulouCwYm2ElOyFkJqU,45978 +pip/_vendor/requests/packages/chardet/euckrprober.py,sha256=Wo7dnZ5Erw_nB4H-m5alMiOxOuJUmGHlwCSaGqExDZA,1675 +pip/_vendor/requests/packages/chardet/euctwfreq.py,sha256=G_I0BW9i1w0ONeeUwIYqV7_U09buIHdqh-wNHVaql7I,34872 +pip/_vendor/requests/packages/chardet/euctwprober.py,sha256=upS2P6GuT5ujOxXYw-RJLcT7A4PTuo27KGUKU4UZpIQ,1676 +pip/_vendor/requests/packages/chardet/gb2312freq.py,sha256=M2gFdo_qQ_BslStEchrPW5CrPEZEacC0uyDLw4ok-kY,36011 +pip/_vendor/requests/packages/chardet/gb2312prober.py,sha256=VWnjoRa83Y6V6oczMaxyUr0uy48iCnC2nzk9zfEIRHc,1681 +pip/_vendor/requests/packages/chardet/hebrewprober.py,sha256=8pdoUfsVXf_L4BnJde_BewS6H2yInV5688eu0nFhLHY,13359 +pip/_vendor/requests/packages/chardet/jisfreq.py,sha256=ZcL4R5ekHHbP2KCYGakVMBsiKqZZZAABzhwi-uRkOps,47315 +pip/_vendor/requests/packages/chardet/jpcntx.py,sha256=yftmp0QaF6RJO5SJs8I7LU5AF4rwP23ebeCQL4BM1OY,19348 +pip/_vendor/requests/packages/chardet/langbulgarianmodel.py,sha256=ZyPsA796MSVhYdfWhMCgKWckupAKAnKqWcE3Cl3ej6o,12784 +pip/_vendor/requests/packages/chardet/langcyrillicmodel.py,sha256=fkcd5OvogUp-GrNDWAZPgkYsSRCD2omotAEvqjlmLKE,17725 +pip/_vendor/requests/packages/chardet/langgreekmodel.py,sha256=QHMy31CH_ot67UCtmurCEKqKx2WwoaKrw2YCYYBK2Lw,12628 +pip/_vendor/requests/packages/chardet/langhebrewmodel.py,sha256=4ASl5vzKJPng4H278VHKtRYC03TpQpenlHTcsmZH1rE,11318 +pip/_vendor/requests/packages/chardet/langhungarianmodel.py,sha256=SXwuUzh49_cBeMXhshRHdrhlkz0T8_pZWV_pdqBKNFk,12536 +pip/_vendor/requests/packages/chardet/langthaimodel.py,sha256=-k7djh3dGKngAGnt3WfuoJN7acDcWcmHAPojhaUd7q4,11275 +pip/_vendor/requests/packages/chardet/latin1prober.py,sha256=238JHOxH8aRudJY2NmeSv5s7i0Qe3GuklIU3HlYybvg,5232 +pip/_vendor/requests/packages/chardet/mbcharsetprober.py,sha256=9rOCjDVsmSMp6e7q2syqak22j7lrbUZhJhMee2gbVL0,3268 +pip/_vendor/requests/packages/chardet/mbcsgroupprober.py,sha256=SHRzNPLpDXfMJLA8phCHVU0WgqbgDCNxDQMolGX_7yk,1967 +pip/_vendor/requests/packages/chardet/mbcssm.py,sha256=IKwJXyxu34n6NojmxVxC60MLFtJKm-hIfxaFEnb3uBA,19590 +pip/_vendor/requests/packages/chardet/sbcharsetprober.py,sha256=Xq0lODqJnDgxglBiQI4BqTFiPbn63-0a5XNA5-hVu7U,4793 +pip/_vendor/requests/packages/chardet/sbcsgroupprober.py,sha256=8hLyH8RAG-aohBo7o_KciWVgRo42ZE_zEtuNG1JMRYI,3291 +pip/_vendor/requests/packages/chardet/sjisprober.py,sha256=UYOmiMDzttYIkSDoOB08UEagivJpUXz4tuWiWzTiOr8,3764 +pip/_vendor/requests/packages/chardet/universaldetector.py,sha256=h-E2x6XSCzlNjycYWG0Fe4Cf1SGdaIzUNu2HCphpMZA,6840 +pip/_vendor/requests/packages/chardet/utf8prober.py,sha256=7tdNZGrJY7jZUBD483GGMkiP0Tx8Fp-cGvWHoAsilHg,2652 +pip/_vendor/requests/packages/urllib3/__init__.py,sha256=EF9pbHgMzqQek2Y6EZ82A8B6wETFeW7bK0K-HoZ3Ffo,2852 +pip/_vendor/requests/packages/urllib3/_collections.py,sha256=RP-cHyTx4AgYwvoETK8q1IVRbWFJnE0VV692ZHSbU68,10553 +pip/_vendor/requests/packages/urllib3/connection.py,sha256=QCmkelYgtbc06DfJtgs22na78kRTLCTbLb-OSWLbt-A,11617 +pip/_vendor/requests/packages/urllib3/connectionpool.py,sha256=fls19n1Y4jnwOBsZz_9F01i08xH2gZXEIyyDmWd-mKU,33591 +pip/_vendor/requests/packages/urllib3/exceptions.py,sha256=zGjhZCR1wefEnCN5b7WouQ3UhXesJ2bRKYIeWusaFJs,5599 +pip/_vendor/requests/packages/urllib3/fields.py,sha256=WUMvCLvnw7XemBq6AmCgNPJwyIJL_vWaMHaA2FLlscM,5931 +pip/_vendor/requests/packages/urllib3/filepost.py,sha256=NvLlFsdt8ih_Q4S2ekQF3CJG0nOXs32YI-G04_AdT2g,2320 +pip/_vendor/requests/packages/urllib3/poolmanager.py,sha256=9Uf0fUk0aR_s1auXgwceoN2gbaIQ08lrum_cGEA9-_U,13092 +pip/_vendor/requests/packages/urllib3/request.py,sha256=jET7OvA3FSjxABBRGhCyMdPvM9XuJA6df9gRhkJiJiY,5988 +pip/_vendor/requests/packages/urllib3/response.py,sha256=wxJSV_6pyh6Cgx7XFVGpNhpZCbh4eL7lCSFaU4ixXXc,18615 +pip/_vendor/requests/packages/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/requests/packages/urllib3/contrib/appengine.py,sha256=NdN_xOgDLMadUPe_dN3wdan_DH9-fxVNqFgq19tbqQs,7937 +pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py,sha256=r-vMDMXAGbix9a7-IhbKVTATmAst-5g4hKYOLf8Kd5M,4531 +pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py,sha256=JsdAh0gL4XvQzhOEBRoFtJN91qLf1LFIDEFZs95445I,11778 +pip/_vendor/requests/packages/urllib3/contrib/socks.py,sha256=uPHtE6R8uyUbD9R8l2wO80c87WDGZ9rou3kNOwV74eA,5668 +pip/_vendor/requests/packages/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 +pip/_vendor/requests/packages/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py,sha256=cOWMIn1orgJoA35p6pSzO_-Dc6iOX9Dhl6D2sL9b_2o,460 +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=fK28k37hL7-D79v9iM2fHgNK9Q1Pw0M7qVRL4rkfFjQ,3778 +pip/_vendor/requests/packages/urllib3/util/__init__.py,sha256=n2QE9_0Bb6u8tf7LUc4qKe8V-Hz9G8lEOc9j_30Q8d0,892 +pip/_vendor/requests/packages/urllib3/util/connection.py,sha256=7B5Mmepg5Xd399VKE__VHxD2ObapYFrB3mWJ_EnIebs,4744 +pip/_vendor/requests/packages/urllib3/util/request.py,sha256=ZMDewRK-mjlK72szGIIjzYnLIn-zPP0WgJUMjKeZ6Tg,2128 +pip/_vendor/requests/packages/urllib3/util/response.py,sha256=1UFd5TIp9MyBp4xgnZoyQZscZVPPr0tWRaXNR5w_vds,2165 +pip/_vendor/requests/packages/urllib3/util/retry.py,sha256=5eA3GHR_L14qz66NU6gr-v5VbKYsvdEqOvCcsx1oLKo,10664 +pip/_vendor/requests/packages/urllib3/util/ssl_.py,sha256=7xR_jvQLTQA1U006wJ1bl2KuLGnD1qQvUcFM2uysedw,11622 +pip/_vendor/requests/packages/urllib3/util/timeout.py,sha256=ioAIYptFyBG7eU_r8_ZmO45hpj1dJE6WCvrGR9dNFjs,9596 +pip/_vendor/requests/packages/urllib3/util/url.py,sha256=EcX4ZfmgKWcqM4sY9FlC-yN4y_snuURPV0TpUPHNjnc,5879 +pip/_vendor/webencodings/__init__.py,sha256=t7rAQQxXwalY-ak9hTl73qHjhia9UH-sL-e00qQrBpo,10576 +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=7vTk7LgOJn_t1XtT_viofZlEJ7cJCzPe_hvVHOkcQl8,6562 +pip/_vendor/webencodings/x_user_defined.py,sha256=72cfPRhbfkRCGkkA8ZnvVV7UnoiLb5uPMhXwhrXiLPk,4306 +pip/commands/__init__.py,sha256=2Uq3HCdjchJD9FL1LB7rd5v6UySVAVizX0W3EX3hIoE,2244 +pip/commands/check.py,sha256=-A7GI1-WZBh9a4P6UoH_aR-J7I8Lz8ly7m3wnCjmevs,1382 +pip/commands/completion.py,sha256=kkPgVX7SUcJ_8Juw5GkgWaxHN9_45wmAr9mGs1zXEEs,2453 +pip/commands/download.py,sha256=8RuuPmSYgAq3iEDTqZY_1PDXRqREdUULHNjWJeAv7Mo,7810 +pip/commands/freeze.py,sha256=h6-yFMpjCjbNj8-gOm5UuoF6cg14N5rPV4TCi3_CeuI,2835 +pip/commands/hash.py,sha256=MCt4jEFyfoce0lVeNEz1x49uaTY-VDkKiBvvxrVcHkw,1597 +pip/commands/help.py,sha256=84HWkEdnGP_AEBHnn8gJP2Te0XTXRKFoXqXopbOZTNo,982 +pip/commands/install.py,sha256=ovG9p9n1X2NPqMgFVtSuT9kMbLAdx1r3YSSiXSvgOKI,17412 +pip/commands/list.py,sha256=93bCiFyt2Qut_YHkYHJMZHpXladmxsjS-yOtZeb3uqI,11369 +pip/commands/search.py,sha256=oTs9QNdefnrmCV_JeftG0PGiMuYVmiEDF1OUaYsmDao,4502 +pip/commands/show.py,sha256=ZYM57_7U8KP9MQIIyHKQdZxmiEZByy-DRzB697VFoTY,5891 +pip/commands/uninstall.py,sha256=tz8cXz4WdpUdnt3RvpdQwH6_SNMB50egBIZWa1dwfcc,2884 +pip/commands/wheel.py,sha256=z5SEhws2YRMb0Ml1IEkg6jFZMLRpLl86bHCrQbYt5zo,7729 +pip/compat/__init__.py,sha256=2Xs_IpsmdRgHbQgQO0c8_lPvHJnQXHyGWxPbLbYJL4c,4672 +pip/compat/dictconfig.py,sha256=dRrelPDWrceDSzFT51RTEVY2GuM7UDyc5Igh_tn4Fvk,23096 +pip/models/__init__.py,sha256=0Rs7_RA4DxeOkWT5Cq4CQzDrSEhvYcN3TH2cazr72PE,71 +pip/models/index.py,sha256=pUfbO__v3mD9j-2n_ClwPS8pVyx4l2wIwyvWt8GMCRA,487 +pip/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/operations/check.py,sha256=uwUN9cs1sPo7c0Sj6pRrSv7b22Pk29SXUImTelVchMQ,1590 +pip/operations/freeze.py,sha256=k-7w7LsM-RpPv7ERBzHiPpYkH-GuYfHLyR-Cp_1VPL0,5194 +pip/req/__init__.py,sha256=vFwZY8_Vc1WU1zFAespg1My_r_AT3n7cN0W9eX0EFqk,276 +pip/req/req_file.py,sha256=fG9MDsXUNPhmGwxUiwrIXEynyD8Q7s3L47-hLZPDXq0,11926 +pip/req/req_install.py,sha256=gYrH-lwQMmt55VVbav_EtRIPu94cQbHFHm_Kq6AeHbg,46487 +pip/req/req_set.py,sha256=jHspXqcA2FxcF05dgUIAZ5huYPv6bn0wRUX0Z7PKmaA,34462 +pip/req/req_uninstall.py,sha256=fdH2VgCjEC8NRYDS7fRu3ZJaBBUEy-N5muwxDX5MBNM,6897 +pip/utils/__init__.py,sha256=HX_wYS15oiYOz-H3qG1Kbi1CY7AGWCNK5jloiD0fauc,27187 +pip/utils/appdirs.py,sha256=kj2LK-I2fC5QnEh_A_v-ev_IQMcXaWWF5DE39sNvCLQ,8811 +pip/utils/build.py,sha256=4smLRrfSCmXmjEnVnMFh2tBEpNcSLRe6J0ejZJ-wWJE,1312 +pip/utils/deprecation.py,sha256=X_FMjtDbMJqfqEkdRrki-mYyIdPB6I6DHUTCA_ChY6M,2232 +pip/utils/encoding.py,sha256=NQxGiFS5GbeAveLZTnx92t5r0PYqvt0iRnP2u9SGG1w,971 +pip/utils/filesystem.py,sha256=ZEVBuYM3fqr2_lgOESh4Y7fPFszGD474zVm_M3Mb5Tk,899 +pip/utils/glibc.py,sha256=jcQYjt_oJLPKVZB28Kauy4Sw70zS-wawxoU1HHX36_0,2939 +pip/utils/hashes.py,sha256=oMk7cd3PbJgzpSQyXq1MytMud5f6H5Oa2YY5hYuCq6I,2866 +pip/utils/logging.py,sha256=7yWu4gZw-Qclj7X80QVdpGWkdTWGKT4LiUVKcE04pro,3327 +pip/utils/outdated.py,sha256=fNwOCL5r2EftPGhgCYGMKu032HC8cV-JAr9lp0HmToM,5455 +pip/utils/packaging.py,sha256=qhmli14odw6DIhWJgQYS2Q0RrSbr8nXNcG48f5yTRms,2080 +pip/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/utils/ui.py,sha256=pbDkSAeumZ6jdZcOJ2yAbx8iBgeP2zfpqNnLJK1gskQ,11597 +pip/vcs/__init__.py,sha256=WafFliUTHMmsSISV8PHp1M5EXDNSWyJr78zKaQmPLdY,12374 +pip/vcs/bazaar.py,sha256=tYTwc4b4off8mr0O2o8SiGejqBDJxcbDBMSMd9-ISYc,3803 +pip/vcs/git.py,sha256=5LfWryi78A-2ULjEZJvCTarJ_3l8venwXASlwm8hiug,11197 +pip/vcs/mercurial.py,sha256=xG6rDiwHCRytJEs23SIHBXl_SwQo2jkkdD_6rVVP5h4,3472 +pip/vcs/subversion.py,sha256=GAuX2Sk7IZvJyEzENKcVld_wGBrQ3fpXDlXjapZEYdI,9350 +pip-9.0.1.dist-info/DESCRIPTION.rst,sha256=Va8Wj1XBpTbVQ2Z41mZRJdALEeziiS_ZewWn1H2ecY4,1287 +pip-9.0.1.dist-info/METADATA,sha256=mvs_tLoKAbECXY_6QHiVWQsagSL-1UjolQTpScT8JSk,2529 +pip-9.0.1.dist-info/RECORD,, +pip-9.0.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +pip-9.0.1.dist-info/entry_points.txt,sha256=GWc-Wb9WUKZ1EuVWNz-G0l3BeIpbNJLx0OJbZ61AAV0,68 +pip-9.0.1.dist-info/metadata.json,sha256=aqvkETDy4mHUBob-2Fn5WWlXORi_M2OSfQ2HQCUU_Fk,1565 +pip-9.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +../../../bin/pip,sha256=SznjqdhnKU_iYQ3Jk80J49OcRfsJ_xfD2SOkExxSa9o,240 +../../../bin/pip3,sha256=SznjqdhnKU_iYQ3Jk80J49OcRfsJ_xfD2SOkExxSa9o,240 +../../../bin/pip3.6,sha256=SznjqdhnKU_iYQ3Jk80J49OcRfsJ_xfD2SOkExxSa9o,240 +pip-9.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__pycache__/__init__.cpython-36.pyc,, +pip/__pycache__/__main__.cpython-36.pyc,, +pip/__pycache__/basecommand.cpython-36.pyc,, +pip/__pycache__/baseparser.cpython-36.pyc,, +pip/__pycache__/cmdoptions.cpython-36.pyc,, +pip/__pycache__/download.cpython-36.pyc,, +pip/__pycache__/exceptions.cpython-36.pyc,, +pip/__pycache__/index.cpython-36.pyc,, +pip/__pycache__/locations.cpython-36.pyc,, +pip/__pycache__/pep425tags.cpython-36.pyc,, +pip/__pycache__/status_codes.cpython-36.pyc,, +pip/__pycache__/wheel.cpython-36.pyc,, +pip/_vendor/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pip/_vendor/__pycache__/distro.cpython-36.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-36.pyc,, +pip/_vendor/__pycache__/ordereddict.cpython-36.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pip/_vendor/__pycache__/re-vendor.cpython-36.pyc,, +pip/_vendor/__pycache__/retrying.cpython-36.pyc,, +pip/_vendor/__pycache__/six.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/helpers.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/requests/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/retry.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc,, +pip/commands/__pycache__/__init__.cpython-36.pyc,, +pip/commands/__pycache__/check.cpython-36.pyc,, +pip/commands/__pycache__/completion.cpython-36.pyc,, +pip/commands/__pycache__/download.cpython-36.pyc,, +pip/commands/__pycache__/freeze.cpython-36.pyc,, +pip/commands/__pycache__/hash.cpython-36.pyc,, +pip/commands/__pycache__/help.cpython-36.pyc,, +pip/commands/__pycache__/install.cpython-36.pyc,, +pip/commands/__pycache__/list.cpython-36.pyc,, +pip/commands/__pycache__/search.cpython-36.pyc,, +pip/commands/__pycache__/show.cpython-36.pyc,, +pip/commands/__pycache__/uninstall.cpython-36.pyc,, +pip/commands/__pycache__/wheel.cpython-36.pyc,, +pip/compat/__pycache__/__init__.cpython-36.pyc,, +pip/compat/__pycache__/dictconfig.cpython-36.pyc,, +pip/models/__pycache__/__init__.cpython-36.pyc,, +pip/models/__pycache__/index.cpython-36.pyc,, +pip/operations/__pycache__/__init__.cpython-36.pyc,, +pip/operations/__pycache__/check.cpython-36.pyc,, +pip/operations/__pycache__/freeze.cpython-36.pyc,, +pip/req/__pycache__/__init__.cpython-36.pyc,, +pip/req/__pycache__/req_file.cpython-36.pyc,, +pip/req/__pycache__/req_install.cpython-36.pyc,, +pip/req/__pycache__/req_set.cpython-36.pyc,, +pip/req/__pycache__/req_uninstall.cpython-36.pyc,, +pip/utils/__pycache__/__init__.cpython-36.pyc,, +pip/utils/__pycache__/appdirs.cpython-36.pyc,, +pip/utils/__pycache__/build.cpython-36.pyc,, +pip/utils/__pycache__/deprecation.cpython-36.pyc,, +pip/utils/__pycache__/encoding.cpython-36.pyc,, +pip/utils/__pycache__/filesystem.cpython-36.pyc,, +pip/utils/__pycache__/glibc.cpython-36.pyc,, +pip/utils/__pycache__/hashes.cpython-36.pyc,, +pip/utils/__pycache__/logging.cpython-36.pyc,, +pip/utils/__pycache__/outdated.cpython-36.pyc,, +pip/utils/__pycache__/packaging.cpython-36.pyc,, +pip/utils/__pycache__/setuptools_build.cpython-36.pyc,, +pip/utils/__pycache__/ui.cpython-36.pyc,, +pip/vcs/__pycache__/__init__.cpython-36.pyc,, +pip/vcs/__pycache__/bazaar.cpython-36.pyc,, +pip/vcs/__pycache__/git.cpython-36.pyc,, +pip/vcs/__pycache__/mercurial.cpython-36.pyc,, +pip/vcs/__pycache__/subversion.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt new file mode 100644 index 0000000..c02a8d5 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip:main +pip3 = pip:main +pip3.5 = pip:main + diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json new file mode 100644 index 0000000..9eae02c --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}}, "extras": ["testing"], "generator": "bdist_wheel (0.29.0)", "keywords": ["easy_install", "distutils", "setuptools", "egg", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*", "run_requires": [{"extra": "testing", "requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "summary": "The PyPA recommended tool for installing Python packages.", "test_requires": [{"requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "version": "9.0.1"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/pip/__init__.py b/venv/lib/python3.6/site-packages/pip/__init__.py new file mode 100644 index 0000000..9c1d8f9 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/__init__.py @@ -0,0 +1,331 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import optparse +import warnings + +import sys +import re + +# 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.requests.packages.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + + +from pip.exceptions import InstallationError, CommandError, PipError +from pip.utils import get_installed_distributions, get_prog +from pip.utils import deprecation, dist_is_editable +from pip.vcs import git, mercurial, subversion, bazaar # noqa +from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip.commands import get_summaries, get_similar_commands +from pip.commands import commands_dict +from pip._vendor.requests.packages.urllib3.exceptions import ( + InsecureRequestWarning, +) + + +# assignment for flake8 to be happy + +# This fixes a peculiarity when importing via __import__ - as we are +# initialising the pip module, "from pip import cmdoptions" is recursive +# and appears not to work properly in that situation. +import pip.cmdoptions +cmdoptions = pip.cmdoptions + +# The version as used in the setup.py and the docs conf.py +__version__ = "9.0.1" + + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def autocomplete(): + """Command and option completion for the main option parser (and options) + and its subcommands (and options). + + Enable by sourcing one of the completion shell scripts (bash, zsh or fish). + """ + # 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 uninstall command + if subcommand_name == 'uninstall' and not current.startswith('-'): + 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]() + options += [(opt.get_opt_string(), opt.nargs) + for opt in subcommand.parser.option_list_all + if opt.help != optparse.SUPPRESS_HELP] + + # 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)] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1]: + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + if current.startswith('-') or current.startswith('--'): + 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) + + subcommands += [i.get_opt_string() for i in opts + if i.help != optparse.SUPPRESS_HELP] + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def create_main_parser(): + 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.dirname(os.path.dirname(os.path.abspath(__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) + + parser.main = True # so the help formatter knows + + # 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 parseopts(args): + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['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 + + +def check_isolated(args): + isolated = False + + if "--isolated" in args: + isolated = True + + return isolated + + +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 = parseopts(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.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=check_isolated(cmd_args)) + return command.main(cmd_args) + + +# ########################################################### +# # Writing freeze files + +class FrozenRequirement(object): + + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def from_dist(cls, dist, dependency_links): + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip.vcs import vcs, get_src_requirement + if dist_is_editable(dist) and vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location) + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + req = None + if req is None: + logger.warning( + 'Could not determine repository location of %s', location + ) + comments.append( + '## !! Could not determine repository location' + ) + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ + 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ + (specs, dist) + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend().get_location( + dist, + dependency_links, + ) + if not svn_location: + logger.warning( + 'Warning: cannot find svn location for %s', req) + comments.append( + '## FIXME: could not find svn URL in dependency_links ' + 'for this package:' + ) + else: + comments.append( + '# Installing as editable to satisfy requirement %s:' % + req + ) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + req = '%s@%s#egg=%s' % ( + svn_location, + rev, + cls.egg_name(dist) + ) + return cls(dist.project_name, req, editable, comments) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/venv/lib/python3.6/site-packages/pip/__main__.py b/venv/lib/python3.6/site-packages/pip/__main__.py new file mode 100644 index 0000000..5556539 --- /dev/null +++ b/venv/lib/python3.6/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) + +import pip # noqa + +if __name__ == '__main__': + sys.exit(pip.main()) diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16d0fda2349fdb57ede04bf79d87b1e0b0348d20 GIT binary patch literal 8427 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 rK$rcgNJ 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 RX8{kN?l!D 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff6182eaa32469d2e3d0e01d933793d8ce75d30 GIT binary patch literal 12981 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 JJ(79u{{klgRo?&r literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa0a9f707a8c11886e7b06d9ff400d1eee0b7d2c GIT binary patch literal 10535 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/index.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42464e799e747a4b6ca3c5509a7af2c14cf5ec4f GIT binary patch literal 30285 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35013d61836b199e67e89d97ef7208feda4c4770 GIT binary patch literal 3921 zcmai0OOxBi5yk)@0D_O@u2w6pWXbSL7Husl#Sf)ivJ;iXwN;kZj&@_&ta2eBX2=B> z1mMANA2c?HP`Skw`<5S&OY#F!l|%l>9DK=1_ndS}_kg=vD~FJUdGt*8^mKpSJ?}Ic zuJh%;zJ7LI)BdfU`88ntYxr_a*EFj2HA<)+lZoEf3671}=o_jx7k#B)QFE(rL2t(P z#OXU~ZzZly+`c=h^=oQw#q~*}-N1wEYdV{XGrtyFp*0 zuh3VYkbZ|6+gkhe+3g2u7>FoMa_?Z5apoN`FHX}vZduD6Lbw5vFNub0m2={`K5}HrLkmdPs8plT`_k=^#wuQ7X zr64kb`wy5)S$yhHmVa)YoBFutNGS~myI@Sw)ToD$c`>{s#-)N7tub>An z8na)y9{e8jXki94O?kFA3HTo43mYb2FLkr$$|z1r4z}91)YDv=Ss-?$IZmTQUi#wx z7yiB8gWgWhe|Y!NXT3-M=KTk~t-B9<(o8d!$jSkpDbN3W)5G5O_T5iu-+kv$e0zBK?(O)!Y;mQ^EiWd}DoX>>2zT(y0kvsmvZK+dg7q z$`fygPXTX3h_5#x%J?)%qGW`CivV1Kw;ypa4Put;-|#krIA>l8c;*LD&H%aSU0LHS zi2aPSVRX17Yl9$Xi`iz|l=g0r2SRXZK=etg+$QZ26G&BNKGUqhUF5}u7XCB=d;8B- zcoSB07aFbN5|gYFQ|D->Q@cRzP{>tw`3NQ@YE^3pb6lB|IXNz=RsnTIVcCY<{(;)# z6tK=eP`1K6WG)c=f~}$iEdw_3AVGLZ>cQ0nn|L|md=bNWM_FffIY~E0aXJX%4P4$h zU504e*=kpL4b=9D`y8vJy0NsPTt&1l>$u0Cq|^s? z*-TQuJWlbvXxi21#`I5jz6(-w2O7;m7KW_OzNF2+yX1!1Sj3f+Dh4wqmu(hBXH6-ZNM z(ju6&e$>AO_$!07&F5BEHkC_dUGNdS=mIDNdgrEc%L^ua=H7{;T!iT)`{)3U%JFcE z@SD(WhALoT)PxT$s(`o)Nfn+bdaO;zu|>2cYq=D%qca>Zq}v{RPHV7*`7;`zwrb4}9Yqo^*Is)bDBEtR2@yqo~nZ zQNN(g^};UdceHQ+0g1j2x-==I{XL8Sr?4U6ECFu|Kic>nv>=*To@?+BpkifwZoDea zj~&{?2NjIg=rUcwhrtE#)VxyI^xPe-FzE7L^_1g+;=71z>+ndJ6S}&t9XCp8g;6x< zDqThysF&imA!N_b-aeb&0*`{X0IhL;QboNy++`D{c5$qCP~PkJU>A=DurWkvei@nUeYg&q z+Rd{#5)`T|epFjiVgf|`Bktz)r*Dk#&m)N1;0cZfc=(mL! zH6&D$NE&{}yo#7iMel>14&=UxKW5Wpit5bF1Bzw(rw4^nK|GMF|(=1Na@^bIK}E!)+U7<7YfJX z1t2XzUU)#I{rPr@G?N`hLb+Nt5tSv-eGGwys$?exQdZUR+xK^RvZ^#Ii=i4~sk5L2 z0K0UsN2;_yb}n+>0e$33%tk?YioqToRG`qvlJCd z%714{f&!4jj&lcU@HA#0VUXq&8bk}?1pa!RwDcCKn{L%4rr}hbhEuly4>};DiMX=r eCZYzv7Eqe1HK9k`I0n*AW>)1o$glu^8u>33l|>5x literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee26f69c955af84c9be6c66bbf3eb53bb9309b92 GIT binary patch literal 7516 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 TEm@{@+?uw2shy+&x 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..bee5f5e --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,107 @@ +""" +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("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pkg_resources") + vendored("progress") + 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") diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3345bbb6d43ab5bfd95d0722dea5de7674344dae GIT binary patch literal 2793 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 GjsFeUtfx`{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b49b806f20578615c39e19a75195118b146e5562 GIT binary patch literal 66419 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ordereddict.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/ordereddict.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..571d935418608aae3558a343c83e552342d25866 GIT binary patch literal 3617 zcmb_eO>Y~?5$*07Qo|7~>&vobYZWG02TQ{i{jpwc0KwQK-XuT}?ELDqLQ4RqzgRbf6?wPJv^{T3$-MA43 zU;pFvziu-2Pd0bu(EkiA{Sky@lEzv z$j$1e+?2QQ-7UE#Z{xY8Zp)I~mUrLrF|Xc{_v8*nx8(2*XDBiR8z=-Z21}y>GEG{}Vq8N31P4d&RmtJ~Q5NsDI8G-5B@B zc)n&`@q2p9jrd6X1qPQ4n|p`vX~W@%YLKY9QLYto0MX3v!F z%W~d&vFh5w(OIHC*Se?eS~RD76sfMXD?c+vx8C;6WJ#_btD3g?ej;l|l|AdHDsEUG zzfY}y{0Eu-jp-FA@qN3J=+-F~RZeTV(&)voN?LicU-|UoX9IIG7<{}RKTn!ZPM_DG zf6~>@I*)NRyOpC#(n=n^?YCn2$Tarjc4Me%$hGJcO7(Q5m)Tgt#(T+`4Wg*kZJ8*# zNA{)d887lxE_ldSa1S@kPwH) z-i$+mz3<8AUIyQTxtS=3Fj5 zy22eYx8u$MIwO`A4eAu7*%8;f222|Bwiv^}-J)?}oxQ;^KEi^7QD9O-Aiavi;Rc0s ztJkgRvr;Q9sZL_f$~hbSMxA9TG?=QPcd(uH!7r`vqB|j$_2XJ<9KG~y3@&O+7RqOE!CnIBIln-DK;sQ@E-u)& z=zoiRc0oq)U<81DgSQCd5g&Q_ORPl}X`tWmzM?PPn=^-ZINO+POeu-@mlFS)u=F>p zls+#IsoSh6{whvz0=R@*7FO&%w)_|rb`j?oOWE-I@E~rbrrzr$FTSK7(%?rjyu0 ztDBn0Wo*)Bsu?L|!^<6A5nsh1L(~`Hog!{{h!3}}S8--1;{S|~l2MTCPJ z05IKkA%cBm+4MC&apqurxH`WVO#vqe{QomqrR z1L-wq6Q{xTTk4Onyp49PMabQU*VoIE+lJUa*c|bf?3*GgC4zk9AFz|+E7VBm5XV&n zw^xr-8&DwE-p0yBt>rQc;RPoJ4c+UIFFK?aIhct&!nU}OWT(rnB&wOqs`!k~g9ar| z9~!u7j2NXNckJn13Azj(P^zM{;E0nP3!vD1gP6|J71lkabtg|zGmyGWuAR?HrgQTz zkIG9nY^6l^TDPt=ZLKMQtv75X&dpho%)_52bHUOx-zjZ*V)@BsC~J3y`P69**jZ$R zIDYwj2hl;L~MFPwMA1Oor7| zyyk#A6F9Sz>qyCT46dg+ bB|y&e86_?)J=@R*2btwwQ2BBOFN%KyrZe{0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29ee12a591a0acf218bbde02955022301ffe8b27 GIT binary patch literal 201108 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

{5fN%XQ}wG{@nqOM{pk(cwY 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8308365af1e959d9e0342fe55e7a4619a01a2e4c GIT binary patch literal 1105 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66762ddf9101a2997c1351581a7326ad48bf01e3 GIT binary patch literal 24483 zcmb_^4SXEOb>H6JCk_V?0zp!gDCzV~NaRuc5-EwINP-kai-aHo5~Y*m)8S?T9B{Zh z&hC-G8I){+w&*yPX(w^ov~^lH{c!7~b=#zF6E|s{HmTdVO;fkcwvF4yNu#Dszth%D z>-_(3cK7Z8kgAm4{dV`w?97{)H*em&dGluX4-8~8FMjRi&$TS;*R8JK8NkPIxq8sD zlvT7;Oxd;AqFuCOgyXe%F)q(UF(J=nF)7bfF(uD*F|88Cj7k>!oYZ_)#kN~2wO|+f zqfi>5oC&Ga$L;Ob^_XfeB#Q%1PJiARoQV}TIYYSL;tb=y*%>U3I9rNakz-r&*7{Xv zyGh~PHe)l5lb*jF&}L@`(hW+wJLd0HeXBA3O=k$WS5{-lclNZUa%$kJr3Re4R^!F| z@}P6KlV7z~V=?Q3RnI3Z=bnY^^_b4ZEdC|$8_fH%RnNU-!XIV$mAu-dhOS!0d(|y! z7|;8Fd$Sq=?h(O#Kf+toR)n`Y_oJ)_5Z6Gv^s^*18B+Us*UGq^^82vs1M2WS#?&O1O5lpxOz^F3pAmgSLX$qR8#5& zfnHP>)Jp=rtcvOtfnHUwsSgWOQm?DBK+~$Clt7M}QL_Tgsj8Y6XhAKgnm~(cF@Wl- z9zYG%P)&JzQE922t2}wO)FpXdR!i!#q*zvMiTQ|HQCB494fUq_s6Zc6Z>d#*uBwl# zPYCq3x~4uU(D$iNsqYu))9M}d8G){=&#KP}^aJV#)ei~udG*8U4+->#)sF<2|A_jd z>W@j>7u1icKQ7RpP+ttn_><1V>c_TO>Q71hpGN4k+vn_Y9$00b*PUJS`<*@Nuk!6SYZdb6dg9{i7pzzI0Nd^o zF4X0#coQogkhBNXUt=nan7^)m8YAYXWyBl=$N!A_nzU(D{f!9v*$Dc%2>P25^tU4D zYZ3JI2>SU5`r8q7RDCHZ`z86B6=PU!y-d%hgee-zKH;;AoP5R=`N#8u~JQnoLW6s0K8)NU_ zY2%8U9s-oWmAuONIVt`0gfj{_rM`rFntg?5rYF?b6Uv66*+lUO>U1Qk(-U2F%3Pe1 zIvsJI2DhA+A^o#K z`rP%bW{b%SyAXdCZ9Z2VM`$;$0%D$X?kY~yk0P`uOoQhmxc1^LQ|`khDNmDQ_TxGr z^gAFL%>--X-0Pf0{6W&qNzOm-oPhK`FVGmENr6rRniA*~pce#s8qkXZod$FPw9V?@ z1*S)F9YXmp;dvO>V}M`A^Ko2H050Nr1lN;*UqSv?0Urg1*8=z{z#k6aV}MKbDWo`# zE5ypa3$d~XL#*t_Zmg_ph?TVsv9i7;w3{`A=7M(L>#&Ar0+=;~CL{5$0De~B-1VF$ zr;}ReQ1{pIB#oZ~Tz005716b!$T(`=LHxvOY<{LV`-(za=2Q%2Rsqcy7o1vgQPS3n zb*DbxC^m3!7MsZPeDR`a;aOG z#R_UPi!j^xGHO`GlkIv1@PZSc_ngFh%YgAb1p3mN2KibY&?q{MN**zS<{S0=#IiSs$G&{IuJZfeC1~%# zlVn_{0qYEIHI~btZGDN&Nw`jJMrRQrx9?8xY3k~wvgho%RMvZD8a0I$?b&;1&*206 zm%NKhO9u|s4mM}^UOHGg_-I}4Uwj0=+4`QTJRT``{`1t=G052qbSv7b*)&t@1;TzJB}u0N~L;v(J7VuY^k)^P^}u_T&Z-i zRj!#gdLXQGr}jF>xIWyD;1bjsTf*-?g@}rj1%S_pOly`{ zT6F4O*{h;Iy+*#ApJ~-A3>C&fH?#psN~KZTPw<5wM{rF|(2TNDO!q9xFfFz97Qh>K z*f8FB)(Ui`nB~Rh?Gcy7#}JMd;bf2sudG@+7c zMG93pTW&9(bli%5&z_KWgU)(8@Q&KL9}j`oRu`O7tyjHL=_RBHnQ3#UByg2^UkMqX zjUl=*W;lV{iZySoT36y;jBEh1i;B8D?8R4N^9jaKBtq30NmyQTA*+uVMaL*ND;$Ke zakMW}(hfw!CC5*@4j9MNQe!`@oEk%ZU#V0<-?-?C!Q+UiPD6~G(z>BX6VgII-k6^E zZLjI4fT~sV*0vU0H|wCWudwd0p<(1?VuLX|K8$-R)*kL@xFj7PP14$C=}o*1@y5Q= z_wyEwdjrYvxg9TF#3j9+u`_Yan4Vr2eqfRUZc(pi-nM2SnN<90A7m4HUHU$y(s(A{ zwh~q`1yc3-{pT8&9Cc1c^>`)3#V5Onm%9%)4`Tph!A6HbzylcWi4cMekFD# zz7ofnP1I8>7$>EK3OFX|C*4-l(fR?Pke2%KiI?~LajMflqnqDp}!P-2VQAh zAs_b^7jRcJc1ST^!pQdk2pHK0-AFSVEDhR#sfD3KMvZG0scPke-O9p%Bd^(Xf`YV5Zly%rb9% z*1njSG~)vmHUinV3yUZt_vJbIPLh&g4oAM9;~s)Bb4M{12q zx#k`P5az+GbPKo-@}Wcq6A9@CB=eJua@Uk7GcnP<#p1{lWW|wK+e`wcD?vCZ@&+7u z2$}Rj-uChqjmofpgzwmwE4Tu_%Ox@?>E8@a{)C@G+R6jv}Pvm4YXkjr~Va=Ex<{~E?V-il! z5p%^L%sA;%(K3^65=Jymx+!cM^{FftX=&B3a)`;O0X2wcU$DiL4Yrv2o&I7@Wk8}4 zf21^7T{?%!VWRBK8O77l?QdrD_#MwL;zhoRH+iF0Qsry}aGv@-2d^tjrmE-W-PW|B zsawbjhN-!#n-?vJnQ9JoY$VT5oSNAG$iDncwT=acWUn>K01NpuUf!K+v}!6p?O>I* zh{CJWHAk>ruA(C0I<0U}@|A0~yt4#>LjCv>RxeQ5v7Va=((RXwJ+hrLYK(NHc4U?U zRSfkK7F&jCY@;#^EYus9>%rt0Nu^C_br2_umbKhN_Wp5V7ui59?T(Eo+~I0ghd-uI z;yR5>VhQ|w#WTg0Wyn$V$^9(#eNd+Lq+KZ)#@Z3kJNwGDe7=eb%vG;7_}?t?y$>aLcY zs}VUisL@whBQpbKDYrJRRab@{Vnu5bszS?IAs4o{C&33^46BZZ%&Nn)6=r1`mEVe) z6-dzO?Ym`cnPG$FA4Xxl;pNG*;Sv$eAyfF7XPsqPcliBgfSX0gO$d*rcZZl?V>^w~ zXG7^5jJ5CHm@T^UL`^0Aqo$shrh4Gxm9VKcntEr?0t?ccD}XDumsqjA-1=7Dp25xEurs<_CKT`(G@O2a_RvRm3+ayv7q{1JQ+6~81SN4cr3H}8x4cq0;2+N>GpWpA zrVnZ@Q&ez8Kdx|(;aX#cEXJ{XN+>d69FvAt&Uwc%%?P->=HgEh?WtK#l88Z}II zv`s=MfCa1?yzMv78LUAZKNrNBP_kNYwmh_{6l8Mv($o2^jYXe zewGOgz5IB)$_DV>j~nD2s);l?Ms-4!Mt!C_+bnD3^mAhpnlPbsrO{m0&a9sy06W+$ ztX|WLrP+GRPs{>pGgx47prl%hi_0ZUr4Cw`>j@3cd0rDkrm;|U=F8|m1A-=Pc~$7V z%5^1m{nVJ`X-jO7%Jm24yv14x8m5^0eV|x`;TfT2<;=Kkd0mKJ_e<)aec5NG&Yd-_ zYs-s5@B#r=u~tPsKg|GZC$WVfcEnjMS8JukDlFKGu;Nvb)oX8-*uuFp=T4oAB2Cf) zlNO?+{t-5LB%U6?#)$!iaGFibIQ5}2G!(34}j>^j{! zPB7e^g9-dWMn5w(H8JUE=-UA;z$6Ix17oMpbl&+xlOjXAV$zj~YGt8@VbL^CaIn*I z{N(fUNNcC5IVKVW{G8jUEI3|(JU1yJQ!Wev0Z*lZXWCnkaq6e10$?zRfi<99Ys~to zlk#kb@r59MI7|l#;RJEnrvV4)!}o=*_ak8**ta?4l#nww8H9w|VVXiunlQHH3UPw+ za)wkviD8;TPn!O)Os~4+$ET`G?J%amm@rWCyahjwTi0vE+!E%-$fn-oxqkoDLKJ9+ z?=haD_hA-zrTNLJ1w1-985hXV$e(CIZFA>oJ8Oao&#g?D(i!`OnvhCN$abX*rY(sW~q`OcZp ziN;bpOi}1cu{Ff(E%fvc>fYUpey*i!U}oqw5TfnPX0cr8i42k$aT8^LLA#;XW-yUq z1_}8ogRDK!gWDet%FvDJh8Ie*u0T6TQ0R*D2bLCVx>*T@U7rb3+y!q!ffptWhUKtn z^GoN>o}U;qgEPtzBuQSb*7xu8Q+UW^Q8GXq78sZh3hk7szMquv#<~bs>%CSG(L?Sy zXZ8!tvK-h-J@h?vQ_UogUEIiu(bF;5mfTP)+epLuMbzvVbSBYRu>;Al-#@`lKQH?_ zeg<`tZt(jjF@bntw8WJzx_(~>)%-rB#eAj9m{bAIH>!2X?=qvGMO3S9a2Ys=7e%1d zthJ!=wCYAJ$OV9jCSs>93Tjp|LGtQlKO?Y*;`#(?aRd+G?v_{yT5SA&3DzACCfp!^ zDwG#p)Q1TTCX)$z3`{ncoc6HkT$I`w13htu>Hq)qwiz5BptmLC`|0g(qj%@JdYfTr zTIbK6;-Hm2Lwoo6eVp}7+z7NM4|JSrG$!ZZL?E$ihIc_KvW93I#F=#Oi)eS~H3a z^UwmAuqV>!oD;fH!R!DOIe<&cVUm7PivlE@h-3nLzn2?YotxGEU27sPU_l*}e%>k9 z7X4d~PrIHjS3IDpR*tv4xe)OPv#yKXB89Ju-X5YkS*1?jjb{t-tdHI*h}OsVGkI8t z90QYKsGpN;7|1@|Nw#UMT$yvaA_iZmixD+UJWM=7?hYCI(Sz`C&{YRp=@e;|np3W~ zntmU~RM7c@Ps2>J+zIEJBzY>pihy+V?e_@;4q%ZWF4L z(|-Jej3<-#{S2rS2GdV;4Jd~FG>o&;qPRx`%3$_$cvGoCL4#JdAnB_0nTDT5Gyx=U zZ(U2tpg~*KkaDAF(9%S|FJj(%Lt=JRm-dq%fS#S~?}w!QAmP`$NXoFk={%8<=_h3U z+upv0Or5gYxAs!%MsK z7}^3msn*P3qN%KjGqYOHK!gp!Ohq@~v>TE&+S5iy$@a+@iAVb%x5l|Cu9CCjkTmWm zjoOry@_j5drAR*$GOqqvWD|oFtbH_EcNwQ-Pna9W-wwG0UTim-Si}A28=3ZK_=0heqV&EGDV!esCA>MA`O)4bY)f?%Z14!~MTw*7tnJi&!&SH1geA~`-vttjfXj&6m z(G+L)ndySI8t2hGF*9#J4#&81JrASWBCW$6MR^>iaXLnbSCU2pNiI*I)dZW5d~n*_@_Pkb+)q=y!q*TqBY zY}Z~1oRYS7?Un?4CStQ}-+ta(UrSNa_TOgP$&!|BV`l&kT=1M3jOne2CpKF8U~mLP z?@U0jLsC$;G~FN(O`RPOc4e?IpvFRsi#*^JJTx}0JNsB2K%FQC4}t=&Kq`hozL1(SzY3uN{P1EGE}X8^m?#y zr}MzsQ%1yv+_~{&%w9E)U~q_}Ba3)b#mA#eWT7}Nmlrd^ab@TVwr=UVvXFWaKCu_E zWkv=T%3*uBRHF5M3yQ}6!+vD(lMD3AThnFV?K?6HO>?QKkB)>@PFU^R;j>aJL*RA! zuY~Df29KBP%YMRJZo&-^zN@-H*C%}sN?C&*w$cF6<`BCT(+{pCNJMl}hC7tlAP`J+ zLT%Nj8?Cxpi+O}Q0Kq%q0$P7>?J8xIr64RnK5tx#tvBPnAFtHb(#PLYkvSqN$?O~5 z(N)gFH*5{JNy$Re9uVjbq{L$<9&1_y*AdIQr-QVo-VwXd7$AFq+|LE8tOjnGaX-nv zz`7JJ4cOJ1LO|z{7+ueXZP+uLgN6xlVF_Z!`#Uwz1vZOhl#XG?d%j&A@=acQjXzTvjfxP2%f>-i;S>nZ~&pyPh_d78{Lbs-HN** zy{+#@Dh>?}VPV#dW;$%iTDv=SYY&8F6_{-Ujfxq%da|?qv4Y3wx8 znOQbDz^(a4%j3QgHY*#h3x|*8e8A9AlBkuW4SRt5aa~)aGw6YLjJ&{}8vL{=fc(UQ zvkc!2KZaeJh09$v{Ln1(5ihBd^PJct^;&%*Rx)+TRQ{-%oxp)THvwQ1ktZ9}G3=c{9{}|8fVl zpSe_ZE|b&!EFr^!ejj0Bj`rSQcibp^B3JTM=wz5OqZyvmd@x?idb!Zvf3qy6g!P%8 zx>=^3C}>w+vW~)Sp{h41^~8H4c*PX{+Kq5T>;WQm1SW?nIgcmaz<2g|J55VwefM6> zy(wck1r%F1F~+7BI+WJOfwZRp79tXP{gke0HeM?uVy$`?x)VszwvV3hhoG`xcY6#P zfOm=qV~WEj=6tyd8|-;!7P?Dua}Xz?b7c?q7}vjLT|&RVE8QQYw$j|UI`!?r70r`o zjRE4qi3JN-tjoleB{AN%UwyTmcoo0mV5?pgMHeSV%1s9{8~TpKaH-a;VFe0}VFQ9` zlIRmRr~(JS5T9~|zBK%XNYKBUJ%b*N!$^mRJ-x1HGtCu|_bZf?sRoC`*mM)M>EXRGPtB`ZZR1CWO3}w7@c{_Ik3G>(pz|3E3 z=eWxlh9b(dI=r~bjOIrV&O=a@>~|tPU>9D)``Yk9hpPgwCqGfvv)E`~xXkC8O6xJy z?ngSc{Xj(z2Ss7`eG+kB_yd-k3(MsYdCwA0p~NqCO7s)Xl2h5( zyYL|p6n^-0!G>=k{ME#re#Kts)Av9}1@Y;`w}LD5I<$ENf>vK=8lF#B#tqWZsuP3S z-3z3854+0trq_^z<3e-re~A?&spt!D9MALxR6MFD2O`p#k#GV4>KQ{lAENR~ixSV* z%<~)p)=r3j0HOF5`;B-#7sNaYr*U}XVc^CB13{v_;}mFtGfn0&CAQMa9WzkD971g0 zNqXhY3YNQVvSxKlyYg@}skkMaR-)q`j3HRVV7qCNjxXW579Oiig%z%zL~BM9#gsu* zOb2KXA!z)hug&~R`vll%NmP2W#ZYDCtNbqn8^&^yiOc_%ZS*#>fn|PU1dpF z@^xj-w#WV-%QO|<7)g)(0u8zs`VoH$IiX|-`(-=zUrXk!lq3ZBCDNLl20i-2zzdrj zJhr?FWB4PJk{LJQa;XV&*{)(d{88h6Ft50&_G=${(JW?ek*VQOjQgVGB zxw0mg{vzOhf#dGaFYQ>d_!)>RDdbH_-Y+xngmv-D7p#@I_AxYa7)EJ42k^|)Gb(o_ ztp=`Sq^=qLJ1ZH~n>EN>xAgC=q^~5Gc6n*8%z!!ns(q#JN@}GKpN!gp(;6`7#^Bt# z0wXSus?*sUAsBZt_-M--Y#*4y@(IT+cDvqk&B+UyqqUM8b&ee64~V1uzQVx*4zI$B z-D^!@cW`O!D%?0ja;k8Ld6o-K0|D%JS_n6ai~+=EXDkSO)qGaqkZ};O82wexnNX%7ROiNHTpVO zL_bYN%7_An7v>ztQ^H(4%}q@qp~@ciqY=k>e5PqQlvBQ*LFBKJE9sPOVf<&{p38qu zPMg4+d5h4l>wJ=6eHs;Tnp5o^xaSvJIAV+Q2pqL}oFXsh!%E_$b9)DFH%!vLuUf|# ztg1Y8TW$yDF`>#?V_47|rr&ms`myYHWBJjHA8$6AMkInX3aervjF3Ppwz-ccjZ?DK z+~?GR2&%d>n$?{-lPxahF2lhGrW#S8bQMv0p4sClT~6-Qs&#l>iD6&Eerl##C|KOu zHtx+SLziD6@z^_-JxG$-xm-esM^OrL_P|E0lDvsP$Y#YZ&4WFR8y4{k+oy+OBB?+Y zjN=lGcx5RZmMn_y9#^gjc#B)Bm3agf|S7Kb)26FI{`I zN^fH$&A|rtS9_}x+|pBM|k7zzJ7x@%6ZhQ6Dx^iKrZ3^7M8$Xx9p*W zW=zz2l8MJ)(zxUp%xTO7Z^veALoQ{L3Q$FO008TV864eRO@I!G_WjWw7NtmV>WB(e zzAWdMKm3x&J~16Zq9rASO%;^b-9@z9T`rX#M9qVFwmtfuRl|Oi z{k(E;h=E%V zG7XAxmu~6h8?pq-kzY^G)euE<08VrpRURCO3DFK@&PiwjP>3-d?pncz=&smHTjjXc zplB*d^fqMF#eJB!W0))lo$`Wq zuq!m0F>wiTzP?17o<$X9RuGXU{%S-atb+^*9wNew(a_adXrq{JlY$+NUQ!66An>E! zF{d9nd<*P`aK5C7H=>>r4@bW5ls&!mBcVqu7#`^o20=m6>jOO)cCj?+bUW9tKaKLE zP6sRlA9fhcs!LR#;@;V1~f`MBBe17r@h%2{s+NQA%^$ucGeOVsM)U92JB zet{;9Y0%B%WP4zID2c9wZs2kE;Ao5sTQrX;MhcZ6d!ajSKlT)(Ls)a*w($HT_Y|A_ za7>h23fM14YQT~>gER~EjfRgr`)wDh$U5OwZzasSpz|dVuKf9>8c2E=%jFf@oTi0iKs^9zG_ugC=W}@(yv1$x{ z?@jYh%baiHQVIHwXAQyu49@3vB(RLC^0w3TwV3gIIQIkt%PcDv?pg%yL z>{&;fII|noFN_+b>Z2pQz?cMS7W4b3t28*9xb$Lq$*s1r-Foi$OOt1cr!?8lPw*5= zu}>xd+4M7u2AB;!RBqAF!sA_gE~iRAWsbGUmxBB_d}959=g^j!TH~_e2!6B2931Dj zP~>zVHWbBmMsV+A>|x$`bjmQ$Fx$^#O6JP~^05T*kr3|yk<=&omM#RwL-@`fPi65G z=>80X7RS;kkt~?jC;AT1;jp9e^$NXc)+bAmMt66T8BeYC>H3-Oz9?PCeQABt0XCSf z9LA3!D;uY>{S21Dj6NrR2(WNu1LB`__B8%?m~uM7yd0w z)`?|hxAa6sb?(g{R-M~bnj1%&TRfVZF@BCTX()ODpfB-JAxl5W+fm+*^L7F^?7Yuu zxb+48O72g z%Oic6NH$+Me|%!%)cMl!$;mUP$IqP_pPKYHg^@2zoIE~tYEra*QSoHT7h$Qn0Hlx! z4uaCLB_ydRJU>YEw?$tW0Ed-v=tPW!>|XfMQPED~a9& zp04`EnI`z7p9hh;6GFd(md5mvF)6_#@}(}&ob;!~ng1bN!ZCI(kt0VDkC;`Mj(_$A z-r=8$4cfz*p`49xa&3*-I7*DWokh+eV9g!e%G~Lkjc05mor>pjxuM(^)_f$EO5mF~ LNzhHWH(~!iP_*@Y literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/appdirs.py b/venv/lib/python3.6/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..4b5c38b --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - macOS: 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, 0) +__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'): # "macOS", 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 ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/ + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical user data directories are: + macOS: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.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 ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by deafult "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical user data directories are: + macOS: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # 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 ".". + 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: + macOS: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + 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_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user cache directories are: + macOS: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname, 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_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. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernal.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", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..ec9da2e --- /dev/null +++ b/venv/lib/python3.6/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.11.7' + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59a9e4b139e351daed485a30461db738b42d4cf0 GIT binary patch literal 552 zcmYjN&2AGh5ccM8lWi)HcmZE?=(F`B?d_fB9kJKgJK|u#ZZpq z*o^GB7$*er#7t~jq(_{Zsht%w#M94YF>7wGMR}*Ly^G)t)i!vD^u3D;Dp9ID%RY*G zMRlY~)Q>d!|4%CLmX=*@`CR*;6spHsf6EP!1rT zajvY;2H^?kdj&OqjwF2m5rP8fR@tWFUuPJ0EPEab`@#qlPXy+89mAi<0_eSnitPok z${UG2*>b}!FII>6<8Zjxn044L_v>=~+QG`6qir4g!h#NGw>xd*S*$kZd(}XfIywq- l(gW+SlyR<|j-2P=v7NrLUha%~+v%x0HKXKs2J>W|`~`BHs22bL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a898e347f38423b6ca59f4cd3e20dfcb4179db65 GIT binary patch literal 1561 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 KXmnMrt^WpF08@4V literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ca627f1d6e07b55ced2944328a15ed14050cf8c GIT binary patch literal 619 zcma)4PjAyO6t|OhX}h$VI1Ub6i?n1@SIPk)E=X{hCa8erQf1Cd@#@6hvr{#E5>ALK zAA&EED<{4JCti~Zam10IfA;T>pQX&k9#MOAIAIhgWG$@ru|>kBb)Ljs8HQ$SzZwiUoV%}Z^0T} zTG;QUUFBval(vvfCrwCNC2u2>q6PFQpgDe17>(`~qQ+)Ge9JX~xRzq0pgA(_nnXsL zXtjkh(-1vC2RpZNwIO(w z7SQ$QTZi8nPDt98-xwQ|+tfk4O)<{3$^dPAv522t&UWs8x4T@ZxmjOq=VJb}#947p zV_n9}m^wSVt)$A%T)t3u`Dcofrk#gZ#v&D;K>X7IewS*73w{XWc| XQt|i+pYR91$3t2te#k?@Bf@_GD@m+` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd2080e8e2dc833e4cb4f7fa50041d381589eff7 GIT binary patch literal 7763 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc1003efc09248f930f3b3e35b21d7432e04a39f GIT binary patch literal 2156 zcmZ`)PjA~c6elU!Rum@<)~!p6qT_n1fi`ZDW*M+zNZYN$F4-Z)w)#TQA{EP#C6}V@ zIPgx+m)VEd7tyt+eubU(9%Uy^;L+eC#YaB=e(w*xzqJ(xzyI^$(*_}*$V&5JegwVX zAQVwFB?H=_l>9;zQ{E*}o@R5e<0=1yv}&JW7irP5@n&ju@#}99elME`lOyQG8xWdw zs3IMvD4cbcI==E%?UHnAs;(L^)>WW3U~H&6YEv~YX(v!yY8zHIR0y~2ly~3CH0{dh z>|K)TKa3m>wUJ{=NXVg`3_!~#)iReRA7zS59uIlm?d!<$NiT_de3HN}t2NhSZKk%D zWT)I{sd$pvoJ(h_JBnj%o^lBmCOw^T+mn{Za4Sy=9;JDqVLwRYnFa*d8J?IG%gwJ4VJ5a6BELX|4!ONlZ>U+?XfiNI8VW? zMf=5J`}>#s=l0|I`OCxfV0ijsd=MRcmzn*+b7-eo`+a+u44-vJNvfXN_%Q9q7Y3JH z7h|2N+_WPZ^)yD>|a8nCDIGda*EfT{CL zB{osBd39EZuVA6T2Z3ya^x~WKSQnOsh@cEz!|^V32lpqKOq&R}59NOroDiQ_b`}~= z3I0BijQvTbf!pC-X@6YRD(dLHgUmsO4tKfzdRa3+8sv5Wd;x+`Mw@h-))|9{!02B*Ue9y&_zkL8dC$Qd(lGZ>LZ^K;Cv$i^71jdCD*ru$ z8DP+{WdQCQ%XFmw2Y0;!{2cZ!@}^FA8W#`NVszY&Z=}r?xTgzneJDvx9Dv9A-i#qU znEP{Lp1@d}Lri9vPEe?I=kC(S$FYK2o0!Dv^6~mATy>Gb1V#8bYW%62dg`a(rd35jr0`7%R{mNGy1R4-2MZf%t;Z pXF)A!26uwZFmO6}uS=HX)tgU3jwT{RdeN672v0 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb60d57373d3a9412cb9d6549a547f2070663a47 GIT binary patch literal 4698 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..afdcc88 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,60 @@ +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/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..2348856 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,125 @@ +import types +import functools + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = set(['PUT', 'DELETE']) + + def __init__(self, cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + *args, **kw): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, + cache_etags=cache_etags, + serializer=serializer, + ) + + def send(self, request, **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. + """ + if request.method == 'GET': + cached_response = self.controller.cached_request(request) + 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): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + if not from_cache and request.method == 'GET': + # 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/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..7389a73 --- /dev/null +++ b/venv/lib/python3.6/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 NotImplemented() + + def set(self, key, value): + raise NotImplemented() + + def delete(self, key): + raise NotImplemented() + + 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/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..f9e66a1 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,18 @@ +from textwrap import dedent + +try: + from .file_cache import FileCache +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 + ''') + print(notice) + + +try: + import redis + from .redis_cache import RedisCache +except ImportError: + pass diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fffd990b4abb3c9bac4b9873d21d98d5a9c528de GIT binary patch literal 609 zcmYjO!A{&T5Vf;OHk&O7sR;GxLoa)P6fMhEsH%_C+yNA zxBf{#qCb*rPy7NWCRsoo%QK$wdo$1Scw-|BzW$wEQ9}Na|Li56k8zh49VeVhlGB({ zvfAPf?@1@`#XU;C5%t<7;9iF2n38q@bADsmQn!;D6xSx|gl1Y;ct|riK6j literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5fe17291bbbb260684a0175bb1ccfa8c442804a GIT binary patch literal 2806 zcmZuz-EJGl6`q;>;c`vNj1Z)b`vWFz(a>nbI=1Vy4FcPO9T-tbRCZ&VD6m*@h9aru zt};7PBw+;juiCKORV%VIYib`Om={;gYb}Ec- z;NMc{TW%*<$pmDdJ6TAw<2Ag~sMwNo_JZX%d}bokoQS3~B`Uu3 zPQBw6p08D&^p@h8)8eGjsysU9+w*rMLj?SRjfcr#_++@XHGE;CVe;td;NkWwE56z3 zwXG;hlD*g-4z^y|#xU93e*Eyc4Ts6&mz!I*F-^{cMImX)(%sUEiTnrC@8it>p7!_k>@YQ| zf0*k2q{yVwW&ig5{-<~E9GS0=j_%&i?(Og1KD;-+_uE|GS^NfLH}601@6Yx>-Z_|M z@?$f(pUo#HnnZ3Uhbota?vE*@<2sY|L)j;j61TCje{9#2QjHI^O33i!8$C1X8q6xY zAWVc|$B%jJVfuov@pVYnxZo`wikRykLuX8i7b5`k0JD4qq8K52B;-3Xkl|}S@|0gA zcgaUVjoeXqj@gE6%Qav(lGkMiYg78j;JR%RZXF<>oc)zEcJ?oj!I*MFgI0p4gX92A z6-c(%)HkZIUL6$qx4a5;*YMNO$s_%1Bf#^DB_4pq62J05gUSbm4rs$cNDNN;n`xdG zrh8B-nhDA$$xu+;G?!gsl5v)nW!DtD%1o8+MK=B_%?^}9hW22TCKGKFZ>q5=^s#MB z3at*6t^wkZ(ZH@_;>$C84eOUGo9Heb@&S<#iToVIwyqkZe?f8rR84M@MwBG8d}fm5 zE}qKwK$zFzk?^@MBFvE2zmxSib^^BN%bEI@0OnBveFaA!(ioqGdv=_QBTR)qX zM#qp?e?K)->(7f>?jqjv^)H>=Rd7iDDQScKRGacGFRYhL@-LxWh9C?D^BzBGUwVSw zH{57K$+__3P_+NVw%JQu6V4SY^bS0sU^pLi z9~>fo1gA<(>9W37sl0H-+f&E-Hi^Y#`hPwEz}wg>DH@E&D05%5-tYq&V?s0y^7IC# z^P>W@^20m6X*jL~-~-`DW2O`=#j4GRrs3NBXII-ibRyFI?$)Vqnw5_@pz*`^&S_8u zX!(c=ogmL6aLKt?0E4Z|IM`^B?kSX1Sx1Dbi?ZlSM|WVXrkkuT8){>&ux#KOAOcEx z*OVI@98xXUG4rW3_3vo!ty1$!Wk!&fbTmTe34W8Wqf53#=ZyeDZv_Mjq6km5@O>IZjQD1-MY3V(qo{M_B5X z^e%4njq}@lgV0AW*4N30KeV;6pucx3MM9VjYICUR+4%g=01k0(xGUU6*?s$pxvTux a=(9TUpVL*~03P8IY4H|KFZ!tShyMYhmxx&a literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b830067a65b4758893723299a870fd785cf9edd GIT binary patch literal 1712 zcmaJ>&2HO95Z+x<6vN84lBliGUpC00Jj85jJI)~pjHW=_i%~TFK?M{9&0SekDN^2D zDUv|TAAK(@GjN&40|gtxeJNw_2I%Iddx`!xyNE4WDlTDv@*r7A6Q zBgb0kbSx5zT37%~5bPC@dI3z665uK(ACzQ7EAkrlBX&W7TR=8vJpk^J_sIn-Y00>Q zGH-tfCj)o6`~5->i`@Tm@0p(z<4LUJ(=; z+vBfx8Wyzb_Apkl)>5K%b!VI=vRK`%+iSt*@j?Yw%`~ssSoLjCs6UB>XUV^RgcF(0 zz~OKf%WzO+Tu2o@Jqn*6?9cW2e13409Zt@k&JL5qXSv)Te*x<(4}T0N>Ey}jG|l)E zJvhongQdh@hN79sc_G6jPKM}-mPOWVR44^cRb(`KlZ7!H-BRcvVIFmvLwnTxPw>}z zVGfRg)JtH3^eHEO#wll*+*OiozRexpzNC;|m)`@8!#(~EeA~Rkx8UpY7Gz+j_I^M! zUK#rsJctXwNG8i@4rGo*P)u-xoks#~R1K`mDnHdtevvocNzEipm0 zl^1XNE!c{=Nnv0clO>u~w`OrR6?I$8C#e+bwhQmU87z3^0wdI>UDlz?O-JC}y93vS z3u_-LGXUNSp2I~3CavOUjJXZ|0le@j&^l@NH{#dazMck{I&{|5$zu@apETGN`I`LJ zHB$hl0j7|W^Ug0YDZm=G{O((kO@#CZh4hn5#4^p#{5Z>eJrq8qRQYM{$3Dkt5G%3g z|D=TfCe=gFU#%pbYM4=TCCK=ph;R za7L`1yGeUflYI|b2wOrVI-pIS@%% 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): + """ + 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 = [200, 203, 300, 301] + 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 cc.get('no-store'): + no_store = True + logger.debug('Response header has "no-store"') + if cc_req.get('no-store'): + 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 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 cc and cc.get('max-age'): + if cc['max-age'].isdigit() and int(cc['max-age']) > 0: + logger.debug('Caching b/c date exists and max-age > 0') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif 'expires' in response_headers: + if response_headers['expires']: + logger.debug('Caching b/c of expires header') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads( + request, + self.cache.get(cache_url) + ) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = [ + "content-length", + ] + + cached_response.headers.update( + dict((k, v) for k, v in response.headers.items() + if k.lower() not in excluded_headers) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set( + cache_url, + self.serializer.dumps(request, cached_response), + ) + + return cached_response diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..f1e1ce0 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,78 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__('_CallbackFileWrapper__fp') + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + except AttributeError: + pass + + try: + return self.__fp.closed + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b'\r\n': + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..94715a4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,138 @@ +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.now() + 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 = set([ + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + ]) + + def update_headers(self, resp): + headers = resp.headers + + if 'expires' in headers: + return {} + + if 'cache-control' in headers and headers['cache-control'] != 'public': + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if 'date' not in headers or 'last-modified' not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers['date'])) + last_modified = parsedate(headers['last-modified']) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..8f9c589 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,196 @@ +import base64 +import io +import json +import zlib + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_encode_bytes(b): + return base64.b64encode(b).decode("ascii") + + +def _b64_encode_str(s): + return _b64_encode_bytes(s.encode("utf8")) + + +def _b64_encode(s): + if isinstance(s, text_type): + return _b64_encode_str(s) + return _b64_encode_bytes(s) + + +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) + + data = { + "response": { + "body": _b64_encode_bytes(body), + "headers": dict( + (_b64_encode(k), _b64_encode(v)) + for k, v in response.headers.items() + ), + "status": response.status, + "version": response.version, + "reason": _b64_encode_str(response.reason), + "strict": response.strict, + "decode_content": response.decode_content, + }, + } + + # Construct our vary headers + data["vary"] = {} + if "vary" in response_headers: + varied_headers = response_headers['vary'].split(',') + for header in varied_headers: + header = header.strip() + data["vary"][header] = request.headers.get(header, None) + + # Encode our Vary headers to ensure they can be serialized as JSON + data["vary"] = dict( + (_b64_encode(k), _b64_encode(v) if v is not None else v) + for k, v in data["vary"].items() + ) + + return b",".join([ + b"cc=2", + zlib.compress( + json.dumps( + data, separators=(",", ":"), sort_keys=True, + ).encode("utf8"), + ), + ]) + + 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{0}".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: + 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) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..ea421aa --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,21 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl(sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None): + + cache = cache or DictCache() + adapter = CacheControlAdapter( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + ) + sess.mount('http://', adapter) + sess.mount('https://', adapter) + + return sess diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..670e6b3 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,7 @@ +# 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.3.7' + diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33317da47d4681155609af4374e7cc645f3737b0 GIT binary patch literal 446 zcmX|-y-ve05XbY~G-<@zSIE%1B`sk^L}SX!}My1TW&1iH(^F zUn{V5zdQf$eD*nsqQJlZc>FdD<5S!JvUGHzt-jI7jof4gH?herY;hag+`*0sy2V`X zVUKrkhx^#)UEJO4HVb%&LmfM~m%B3~_P$KrDt44ZOWG(eFAiQFe6$cu$c$&CDK-t1 z-3nPK=PFygD0kLuS)sh^wXB7VO%-02HJytGS|-OkcQj0f>0KPD09w+F(YlZ@fwTb* zz|~MrrjJPv_8ou^=t3rhOe5Z)p$zs4A#EXRDoR4$4S58mfS(FglD1h>pf;0eDOj${ z&^Se>lVsDpZZ?yYO{>+ooi3&)rA+upuT_cWsG`;2X-!!^XqG8^UhX7Fd((H7xsd4Z e7Z4#Z3n9a5tNb%A@--{YVWt|M-#7ba&-w+qrg{+o literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc7cc9dba6d9ded6797b883727ecae1e3dd594d GIT binary patch literal 3344 zcmcguTT|Oc6xPi*`N}2Gq&K(eC2ku#X_BUsbUGO00EscwhSDfaRmCen#MsVC5WQy(P3SbdRGR&yvqw5-&*fX`MmlZAfBf^|UkOF|TNyYE zx}T!q|4zUZOJS;|GR@MMZt2WmkynakuqcbsHNxIu31+@htth+5k}O4cu~~(sS>~0( zGH(1pw-O|0S&rnKlueRH*eJ=PZi4hllE>IM$>UN^k$izokUSyfw3|Fotc;r?%(`j9 zoNE$}u*s%UxU~11xxC@|`K>P7ZoBz)x8rgraQ%F_-ki_3HXQD>0+;7oT}G2ZH{au4 zC-6G!G}G>KIYs&{uj91+qSN^@T5e!vT= zFktTwg-7Xy*Xz&easps{sKH2u#>}s%fyS=%#$1x>`z2kORmzQMh&X!YhI=)xzy%1@*wu7#X zjQJ@nTO&|Z9w!`%3-beUA)b9@lHxmzYft<7E&^L@R)juXtx;f+zzf>0jH?eZvLO<_ z8`x5lCGp4~e24HcJjKz#NG5f}8!l6=w(D@)Z*kY{jM9TgUQwfSI(#tf zkRyoGA)0-EZLi~A81M$qEgHuM;+>-5j}y2G5l$h(5$%X%I@76N43Q{Pttu3hf4oq{ zi)N|d)jI^cHv=lhfjXl+zVcGtS2tCr9;m(48{+5+HoJu=fj>TC*?rz@y}%?`MQ?wpP*Z|gXAZ?UmjZp;)0eD_;L z=DB#NKBxPcw{>q!mn#px9Pm9DH*_u36$h>u6&gM|Qtt3Xs(y`Wx9`_mle?l`f34mX z>fF#e^uvb3h zXMih!F90QgKI6lz-Q#AY~f@5ZZQyQ^JCmtE}j}Rg5 zM6EcBSqT=mOqQ^c%(PN0X{A}p%CNMRWf?2Svh;P&S)**k8e^lxwJ{M#{P()t4G~F* zNWwe-SqMJ{Tn1pVA@~xadqWHG2=FuDG2j<~4fqw{5Y!9fr_v-M(={r$&>Phm5t(gN zt9225Sgq9-SA{WMTd9iJLV31YUoH!y@~~VNk=42R<*JA@s?F-MNZ00P=a!`jyZVzz zN|8)K=+-gcAT7l!n;p4v$VZ(4<12nO_jm`eI|DToVb|zjnD+J2N8W z8zhq7@}p+rn8l6+mq(XT5wmU9ZP|AJuPi}2ZUW)}{N?c+0RKWF+I_O=wgUOZmYa)g zLym+<>%su{iFwo}A|j&{(Te;eoV897|E~Y<@O^|V_;~_DlYOqo=`?lI$R%^>+ytG` HsEYF+#Jz}A literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c8fc422f55e5623a76ea9d1f3ee0db46590d1d2 GIT binary patch literal 7076 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 IwdNN83cj~^C;$Ke literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbda213f487fd33f048989a53bad876a2b447617 GIT binary patch literal 1667 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbef473b805bb85289f4585bcc400e6c8b2b30ca GIT binary patch literal 4569 zcmc&&TXWmS6~^L55TqnZRxFKUCu*D<)5eM;JMy$?B8iq1H!_t77d7qQ+NH-tdkrNd!ZpqU?U>aV)3!CPbK{l94PQSuY6kiyx6rp#-$dW$IrMX? zZ*gZ|E9Wm5jwv%~y=Zk-K5d|rJv6h168;Lr*J_MwHJ!7X!S$NSjhe;Hn$4|Rj@vbd z=W2QG)Lfp&sjhUsYjrB!peru0R}*y9g-*mELNZ)fL~J5CkZQRg9nb63kA2URuIC+h zc`u-L(er-j)q`}#+SpmId@aq5ohO^p+TPpTtV*+TxL%dU-sVG@d%V8ASv^>n_TlEv z&hB^8#FE3mYvMZIp~%nONzq0Yz` z$9GO%3KE&*3`-ymGsk{v_G-1m^8ZEcP_d;{ydS*`e4*6oVD-fxL8@h26i|yIktq;q zS9kXwukT2EWAD-SR|j%7sl5%Ta(i$0N%i4KKS^tW_7VfLC?Rp5Fs{bN*d^)KXwhFl zMkwL>D-B37xQQA#4i8|5 z1|g6hstJe{l<*6XNNY0`{hYOpSo6$SYg;JhIa~_0jjY4qe{0Eb_0LEA$-5H(Q7t+@u<`6N_+p{;qH?IS$MG?MWS`oi~JCn=YF%^ z3nG~h{m83hCX|-f>%>~0i{r3oXu+s)Y4Im4YZYd zE(rByQ@o2xyiepqA|KHx6ThT(=9@yXmVY`_1nmh)uNv#m4mrwZ8)^oVRA(&RK_>xyS-oz{b% zKf$`VjTIlDD38&Y%cd_ep4qp0HRo?(<4~C?`bd?K*AvrOWS&6w9Q=@#?w1f$N5})E!sQ*1wi46!ND&QnGxJ&b9 zqJC33h@~K|HcrSW?qTsKDB(1S22k6~)=f62&#``S2qik?{~#eDByok2gbH9|5|Vd| z`?Qo4Gb!I^82b&%|CEo8Xpq(Dp*pi5Vf;!9lKUdbk0CCxj3LU{lz6XV)JQ!+#hWXc zT*Zbhl#r5BY6RAw8meDy%=jBa7@02RuS5tt2gV}S)&~YKwuF{3FhI@Nh}pTGdIzhP zEkXXTVzF34O9kD{y*;_Gp9SUv|18QPa0)0vFH|x}`&qrikyXc|k|2=@_i3!8IB6r3 z+pK>rlV{|FnTL;Qo!pJ`4R|J5plSFD{9u*50+OL;rad#(lk7qX3t~}>6K{ja5`R(Y ziLfia>4vSS)$K_3y<~@o2P&BUn$|cc>D+`AvPjW$IC+4jscDMFG{vgCOS2Ikwd7304}uUEHZN3{N_j0AIPxijd5IOJ+Z5en z+yc6S%jsl6)b)H(4=00}EUMA;v<}`M(#=dWQ;g^(eNn|XigHEx5K$AO^UTplLE`cu z8E(d$=x;a_7Dxia>$pkq@PP25P-Bq;5sH8dLJQ%dhW$BQxM|!0Hd34o?9NhZg><)fbf@STj^&ze0YBSy9LIHC$GzoVS1a*BEt4ySw7W-bzY(dA_T*+tM_u&} V>3p92gYg9!Kz$Ds%~GLc{RhpisL%ia literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..b7ff6f2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,236 @@ +# 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() + + +def is_stream_closed(stream): + return not hasattr(stream, 'closed') or stream.closed + + +def is_a_tty(stream): + return hasattr(stream, 'isatty') and stream.isatty() + + +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 write(self, text): + self.__convertor.write(text) + + +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 is_stream_closed(wrapped) and not is_a_tty(wrapped)) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) + 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 is_stream_closed(self.wrapped): + 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/venv/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..834962a --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,82 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..3d1d2f2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,154 @@ +# 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.SetConsoleTitleA + _SetConsoleTitleW.argtypes = [ + wintypes.LPCSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + handles = { + STDOUT: _GetStdHandle(STDOUT), + STDERR: _GetStdHandle(STDERR), + } + + def winapi_test(): + handle = handles[STDOUT] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = handles[stream_id] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = handles[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 = handles[stream_id] + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = handles[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 = handles[stream_id] + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..60309d3 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,162 @@ +# 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) + + 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 + if 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 + # 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 + if 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 + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..d186b0a --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.4' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90e7efb717cdde2bd4e28fddfc4aab01fdc1ba77 GIT binary patch literal 1044 zcma)5&2G~`5Z?8FoEC+G5D$Qmd}!R#mU2L-5>$XxS{J|5{I)-EPw1U<(`G`jx(Bw_oR<_U$IjUJ)C2fTb~*3 zd=)Hs(ovn$P&o^>;2iV3XHoDIbF#suyVZZv-%V+AGdL;-xT-Z2iX~jK#A=)@(|eUw zwa!is=cy{|tjGtEZ2}?k;Y0~xLLnxFoNCh7ggBoLb!+*?z{6;b_*KLuWV2zd;@J@5 zQK6-RD&F3YpY86<>+|`1cVF+76@r=l>NC|kekGSa$rdq!l=29#8g8_ma5dIO0B?HpB zVu{^8P2xybdboF`Pjo_n(3Bi$(3fa@iK}u@NQNLjXzm|b#;KGZ84pxifLt;IK0=N6 zr73BHd~vbMjg>n4t?_>|K?egsNaB|NHjASsS$z);ZI0e*4l<=wKMnfQeVV&aB+0%q zadRW2(a}YE7V$RKUs=Kw6h8D3BJQJWo9n@9t|ed)d0-<5h%j(T(4zshA>1Lc4BlwO zR>S*UR4O_OIL+oP>Kb1c<8hXcO;=!dK!xp!ec8F~-KGy3u<5>?lm*m>00kKTx+hF$ vtm-3-p`a37)rq!3(Oe>QP~qWA$u{_xK(D&<*)-Ja67% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a27e2338b72a6e76cd45ae4640e826949df5c149 GIT binary patch literal 32005 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61c1101dc3e2130759ab0858e4712b95a8173fe8 GIT binary patch literal 42143 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78a37ca0eb9bb62a778395182b03f222d040ffb7 GIT binary patch literal 17377 zcmeHPON<=Hd7kd+>3QtzgXD^oWJzw>qQtSeONn}hRt(7$B~g(!G(}m`M9ysQRL|_} z&P&xjV`kv|G`eR*rx2wrt+Mo9o-} zL+?9>nG*C+db7=t*`d(so&E( zT|aH*0&C|?aPOg2zfTqG_p4Iv`VZQ#Lvfj+q7QThA$!*lE*uAl> z17Cg1!ZRLMUh0HVx3hI+uNe%Z&Y)j&e1ygv%U zC|>64YknBs8ff)KTgRo5?hbt&261(3)ak0mU>Nk#q8diJ({DGT{b3N+^6_%hZ*B*w zG1RD_qy4xz?hG5MqvM4)1AQ~l*Ysd-fBe996b-{m7cLC!cF4l+*w~p*C`T1Ou<8Zns^SN^x~od6jC)a4)B^4$RaJ|) zm(`M5#=W9e)Ct@d)F;(RbqX!3>bzQ2_aL{Z*3@Zr2Dv4*uI^VKL2g++pdLj16?H*9 zq&|w06Y6p0sfUp}sh&_DQy)j}lzK#+MXgo!sCo?dd(=gBPSx<{w8~?Do{X#4{N}FT z4zBi9us3d2Jp68KcS5h(#Zr4Z80sJl`cdfl-q2L_I;`t82fd*mb+)>JcdHX^d)M}_ zT|Mtb+W~T1JLxLv-IMOur6^p-daY%@8{1dI2L45_2G|n;iiQl(*cyyBlz;u*#v>a| z8*TVoz;z1OWnAIkBbiu3H_Awc?MZ2ZP5v-{P?=OzW!KhUpOn#O@fuL_{fU!{mVuIgVNmj2l)QuM zZM;*?XLHwcKuQN&vN-+?Stf48)qW@H_}xwzczz$t9!7q@8LU^b3YP%?e$N9UT*9se z-dopS_XaK51X;s%?`q5I41FH*>EGaZpHcbupK){E{@AOqDfuv?@?yO#AekERf>B`G5zV-Tz#?_6NuDlcH@s06Gl8{Do&~J6xBMsmi z^mU1C93=6|Fd+_&?Sytz!?4@H4EW_*dXGz(SYvz83*xdKHc1oq_G5>XBen-&TvWl$ z{;1oHE8%DhFPlLa#ubo{=5C|uqrCXjZ(h-Qplb`U69(OuzL!J0A*!HHw;x2^K@-%% zkG5l1b|;JrAYdA!w6x!@J7K548(U#)>*gQj^ctFfyL(}%J2(9(xNy_g7g~d^!m3?( z;@Jz&J@w>X^#0!7Q_psv9=4yj`E>K?XZrfd-sAYS`xkCp7yMh zE_`@j4fKTssV*3R81BcV1`w0tT(M%6tkc%2wPd;3-%`F}*;W;AN>a9D zjqjPI7VBw0O>QNB+y-K*VCSRAC<|;U*Ru{Run|k;yLK;sU|Yc2!`wlBVo&miWE0MK z3WBc$k-#sfJ&HPAP@+MvhYb~g?ewES`^^aSeM)suV+JC^DbQZhK{V3+OVVM|&GfB- zKr6127wOIxMgyQ)@ggbN^~;ydur()M%I31(9OytljxUQ>W(zsIegefcM{`xBiWJ0_ zl07yFNnd=b(GH>p`H5}gBKw|IajD+$z5yg%`f%wCfTaz(TbO>I^+sa!<`(~ zmlV;OSPgq(?d0)nPwX8>fijZLN#2&cD|rY6hc>B|JQak7^4U@@cBnZ1_l!tf2NEW9 z{@PW~ZxTo5x4`p5FB}br104m*+uHZCwL0(NL%4fcZ(M9I8hC0TePVA%e%Aw!-(5G1 zXgC;-y1o^O4zLbkfp;UIGs@ zKr@93h!x2oaVZ@jE=Z?(35y$7rZjJ(R?<(SOo)K~3BIj1ghrX&1uYCB{S0e7%j7vE zwY)$`Y&GM2v(-KV9Qr;~c^y~Cv2sP?UI_qE1!j&vItLOm&K%@t5J4QwAcF8{AOd(t z&Pd3xcCfcQkvZJ~YO;14wL*L%A>BGq5Msbf zL)ox+u@Qo41ql{Tw+Ku~@b`Hv+L5h^Plou;dG7Nws1~|Nuv2#F=nfsPpY0GSCEE$k zzK0BVNLjn3aFu(+oPHp(6)^M*Rz&QzBFHB@g-ouoA>H5)JL#glIN@HJ{dFJ%l|W&M z=VjU1{CJqH%4PC0th9f8yXH{J?CMq!^trX?1)a2SM3JnsAQj)ej>s8PG};(HoZ^u* zO;O1}%$C4QtukGBVd1)nl`tG#*lN{R5Ze>3F4&_fb?f_)B$T#p4|}oI(Bw8pHcWpS zWo=v`m8)D~RruIx@VW6rbC`4tMlx}eqh*McZWDz}EISZM?hrZ;AooM4w4dh&fUNlslA!WmYxb)5Dw5S;G-M(z;53o#m#1wiig>q zbT*Oly#A=Sg$Yx%Q~+9Ubkjm73VI9-sK+ZZp*#)qgM zok`~WX>@!_PT9H|#op7SK9q0SdU7U$5NJ9W zF7y%EBcFSdh}3{LfP?RCjasch9|u-KoY82ygLVh(L0~XdZ2(jOw4QUq1PE)W)aHPL zes{k%-Pi>3O?A^<(iDSpk}|PG%(&I*c0HI3I9hifbAudxM{ot(?FUT?H|U9w4#j3T zf|_M!hEJaT+G8_9ZG3t1fxr>=;t!#N7`aNOW)?3ROdF32qo}p^+}J%Ein3KJ5>$M} znz5?_LS*b}%%L-kUDIFea&2G~DX3s;)Q$_y?jQ_O&~&)YRLHoVb=OQwe-hww6ef!z z)&%-j@GhjvmMhx;Lc5H?6HaH;2ETq%jvVK`gVNij#4Wde2pQQG{jS4$1c%Zop?^ES7B*4)7 z(GN^6stWSEI4Mr7c2QcEcPcc!pcQy3WuQr6Qf%2E!z=z5AwXsDeO+`2+0ahp)7&wu zkc6GKA(vjO)4h#q&eAC~Q!V6E3O0PpJozCynxlP2wU=UTKm`;YG7NRu3=`NWdonZd zl3xn_sFLwe(+@f7a9jHzqba2}!#p-s!_r>n?}?h~?FRcs1Y`ST38sLWjEqVmWTk_` zMnpIVR{-&*$-uj{-Dz%9b%-G0g@Q@@AS!UuntYJ0NlaGapz7_JIZ6! zC{lC4tdfukn5+o|oB6U-p(H~}zB>a4C_O%C9?&@)C6FRpdweF`07E-cPCO-z>(^+E z*qn|zURYa$;U^k}Yb_O97ssWwwf^Q&t!?>Hb9=nJwl>{hY4Z5k zS@*-{cyVn_f#Wx~*En^y@O5vX$JMnp7%lwn8YMP%Z>ZV03MmvKnfCQjAHbRtGGG)QwqZl3Bq{p*d02ZPMuDkz zAOiOH!LiBUC|gdAiN_f?_Q;@n+BGl$lED<36WSoXHQ3uFnkeVYlhgsJR)Q!(LfDUh zX<%uXNkS-)J&saSQXx}JXe#JsN^0jmZ)QFzM!)DqqoEM@eh3`qc!?!-ikpvl!5)@_ zj1~%!!SzAw_+$+4&Lj*WY_q*=ZW>!C%@`D)zt^r{+}xa@7*JyG0i5d7NH*dE#_IH? zgjU$d*8uexLR>qP8nq?;Fe=8*wX4^z#04Qgnid58HWT*5K71WXbxn;bF5J=(dG!tE zom+k<(m%^AY$G(dae-=Oqe&~2*DKTgj@{i`GIln_*ct+_pTKqTC|)lBc2W}=-7F!A zMy~2u6=>TPh#x@f{AnOHFWO01&cE@!bI3i@O(v35&{KxjFX4eA2?SplB_Rqs@7Z)5 zP#}R|kcSWfVfoO0FMm)xC>@k1MPPkizYqcACq?5xn9xw>_}6EJhc`jYu)T&eXMmC* zK}!3k4D!da!S^m3kPQHP?;sXrn(p0Xo$pC3@VCN2cLb`H33~}0;dVph31IM|%D{Po ztK;c*4j7S~W+ab9_!pb?_))gasCUap$I6()K?xv{5&yulVIpY(u62Y2{94db>?|<6 z5RvpI6Q9WzlO_}5Yh1zr4bE4eXIX}-NAa`FiAcqNL_MPzELDJ+E*LD;17PCmIZVtN zfTqwq0KPvM>1NOr<2O2?D~LMpWp;QDJd0>awiZEGrE%rZf}{vL_C)m4FVL1*5Vi+P z7<7S>vVop?T}QiO_*w*psYF-kub`x2(0fumbPmeV0vIdopI=_0$Bs<%U;*AZ+j!%| zueSgVc^TzZJgrR9r$sR46AG?fkOp^Boh+*2*Ia59swA^K$yrVoTKTqh0N>zOEWL!W z%16dpo{lwH+Bv1lN!v2oF1L(+v$}JSl%AfTR5YR7&KZn;?_qAT1pS8Jbl+q}yeJj_ zo6d~h^473BfQsuw)1@H?vOeJtjFG@+oIz6?YeJDyQ^gO{NR&>dmlQ@)KB#5%Xp zqGl1xaQr*=K)4J3Z|YI}c*ZgqHo;sfnaI*@1(a2?4>wK|$WYkkjNweBBa_SgF&Pmt zsu-j{HEL2dp?#R$pZ9|G_EcOt+7Tof_66+;WM^}8iw_OZxBy<4X{!XfhWm+~(0oa1 zG{i2Nh=D{OBz&eYi#uIEcl;0!0KM+LoYFi6kJW;^m}7bZVg7=saxXc*LajU z@kv6FD4Y#27k!IHZ-{-;mNmE{sP^Rg#oK&js;^9$`u9!iB@F*4Iol7+0y|!0j6!QL z>O*@#7{R#KA7tt^V6x312mdDcoY-I1Oh^MU8XBSAsxJ^y8wLep>xr71nR4qZXdVrk z1BnBmS=gwY#G<&I0c2e1sizTs(q^F1Vz}*JeEOO6u}HN8ibQ>pwgT>faP8XtVjP}P zcA*gi`a|Q%xB~X2UuGgf4OD#NA_QMF#9gY^!|H*5f+V!y&FuQIucq;|q^dYXWbvik|k4wwkz zr*&H2L=s!AdRbPKs+9gYmj67<3oH!lA{@x8pW-VO`P+LDqWB0r;KQln4q*Is&^D|Pz*O2*6QiE_+ zc){UegAy-KE*&-D%MuloPegiar>))!E`ZW~;3DYFrLA01ZMWM{ z4^#3TuMJtFmal)2i4Zt;rGJeHU91SM3L^N*5bY#XNC;4(YLEaS z_|a^BY`6L{4QU&fBpwsACU#-m?y69K$S!Y3T~-t1pWB8Sw1kjG$=qTZE5V3~5(rBb zWMu_u)fzuMr-$6GpWA!SXyYI?$-EWtmd$u8^3XNb;Z38rBA<9G_~g=*F!fTeM)+FvLpwG#+MlDliazCR351{g7?b~BW3nDWZ8X8y(|x}MR2D#%SnQw+)$(OTrNMKY(%SLk z=DqQ5dZYeS@!1NRK74c@6p`6-F$(HD0C;@PAW5dy-`O^3Pg}uGC>Ts!&~(m=#V~Qv z>EB`j{b@7kd3USeikZYzSNc40RRUR-T#JEnu6W|aJUH)#JK8d{))UidhP;d`9HKuk zVFt&GW~*zw(id>`>w3=@dpVLN2V3%zs1ToLqP zTtwKb1o!_5d~&&+QdDLD9pbi1<6nol4Su!*2>J&I88}!_rGqN2MOB`ZcU}EeG3{0E zL$J)j0zwzQ4)K3+Qh~8BZ{_x`p>=gq!Mml&QuyZxyn!hZraS9d7!~3DL#dec3i_WA zs<50q!Jvru@ZRZf%=Y&FH{`g0g+5oPmb}Bm1C}vYPB5?C0!)oh!63P?n`16Ip%(aL zLU};Z_`ZvAPU3r(;pbT1&7))!^{Oyr((|$0attk#^;v{Ul!k{c`}fb97v+!$EGqOO z_7Q5{fqgkhf;WY_slly2&3RLqC5Z#-^O(XE-Zuui$B>)ULc=&5$nAzWnkJOtMaX5H z!KjUxfsxiwmAd;G+Q4EUaeQ>%_h3X!Bz8QV>#PUsX@5-|q(JZKJGd1>TcH_(C=8ElrVP#~TWZk97mUOwntq7*5oH04Ootvt z^GP-#5v8(k>M>LRg*1=_dpI1zSSAtOXFfbJ+uiPTi3pL#fbjRbj6jp=d9Z?ylo|Ksx$h@#iGPUe$XD1+eM&`~q zSCS7k3;!J)(&uQafnUU|R_#t>h%@||nKAQA(bnntHO}>bs>Kc$c*fon6GWG}@h+#Xo1KlGKoAx$yKMKS% zcsxF}fiQjpyqQB^{}KrHc=e?t#WeH9_N}c>&I4n~qmJ=xEhWabHQ4*x(e`-hvN67` zy>6bLNYD%sfgSj>dhpms0E{-&Vg~;|F{cMI(hzu3Lm+xm3UABB@ zL!3-NCuhU)sbsE(3kPD6{MLWtS35P8Y~xA?!4X`HW)M3J`iTp&<#7=LCyyKG5BO0u z@`)i%Guk_LI{nrl&LjF!AM!bm&(uBE`Bf%VHI1JA%gEJMjO|WBp-U+iAkxp6Ddil3 z*<73^l(InAT?1=4h1eR_^I>ZU<04FqI8PLpw-DvC8+OK+F;g>zl9VEFH!esHk%Mvs zEWOKZi-?PSc`SwGjnq<8CcE)%+5aZe!=8t&b`>-`L`?=Yb+R?it4F zSgZDGepM`gRU49lykXt({d3Ct+|XHYHpLZ4*+wL|gbadic&Y(`4~SQ#_zsqgxIT#S z`dm^XLIQ$q>@V^B5uyjl<{_|KxNKmlE_HlF+(^^-~*`m z)K`(l_a3LHAaw>G6Pm}K7&<&frn}garUB3AZZk>R=&vV1(lewKN*JS|#CEJd!W_ez z1U!>K`Z$lt#HHluTo}9NH0=>E5Lo^jZoZsPDTygp%(d|J-Z!^tv$4>botCYrc3s95 z{wosfnVeiWaQ5DrSU6L8%>-UV7NR-rC{HmiJU?;aNp<%wPF&RZ1Vl9K96Z3z8F*`{ zd?98Twp)mEMU!huEc5#paqe>E?cClo6C3T;p}HY-1HRsA>jKVfmMI=(JyepmJBWIo z*0V4YMM}Vva&h7Uqd^cXat09Ns!rirpJ^qYl13!dc90 zJRC=+__qI(I4D(3N1-2S%A^d_!qL!DT3P=dy3@bUD-7xTVb2~Y5S1-VWhEp0P{x<+V z0+5fc&tIY8e{p@-S58<|1*jnYc#lhUsCkjOc4F*$-^+@W7&w+}OU4@q2(I1@ZrAwo&4Dk$jv_lG^Dw-Nn-n{Ag6ahp(gPuTAD1D5y)MTd z^k1`(&R2Z~$@Eb9^(!yF{sws5)(%u3`I6f$OHal#hzR?!Cfw}#9|K~qQT{IZ*nOTTrEM78Z9{(OgDfT%z=H~ z*aap7SrO=?6w{&{h_uv2PNBaA7+4uh3`>y_~Vf?8P`5Qp~0uJXw+%PP| ziq(xGf8+I7BVLTh^tD7WA@`ESr2M9eDfvwo)AE}sW;P0v%NDb*7|p{;!|q$jDJy31 zU+(0J+4mXE_^bLXU(8zxD_Jiz`iuQ2k+4$rfyQ8QurX8|Y77^L8zaS$#-8Gy#%OW0 zvA4LlF;*OF>?`hT>@V(b94H=a94a1a94;Pi+*iD>ain-e>PXk`ZEHjWmLNewHck{zG#)NK+?Xm(HBJ^!Hl~ZyQns&t zs&Tq_x^bp>M$U8fvyDfJk2D@FJ{mLZWbHBg@vT_#U3RASgq26`>m*k|IR~N3XSL{`{+G^OBoPcm;MrRTtLSeBGho>;_ut^)<>XcF95^^f&v0?Ut>w zTb}Im1}o*tvTc=C6D zU1Gt>xR+zy4jPC--uE(EvAWt)u5G!;RrAZYAD~Z^k;YT71g@U?$t&o-^@x({|TX(=6BPCMPPGKa*qOm@CcJ z-KM#)VV0X_wQ1Sw)AG;^2DaQV0e3Uz+_G%~Cd}5N=^`5~rKIi|^P*Wt)hxl+=sI`4 zOjkX-gx2FPdx2}ltv2k|nhRL#zjF23#h0I-D_x(xa`jbpKZQ&7C4;$(P3ccMrwW_Lj%C3FtPFbB=Y}GAH)NQ`tgmW&l*Y6|%ZF9d&_$qP7~qeyI{7_*FG+=_wR zUR!4>0-u8VkT4GV9y$EUzJ(9XjZUx9Mf%?cUx-3EUVU9(=yBE!rBt% z$#hx`+q@wVWj-=}c6!}ZcHJ&Jwxg$_l13Bw*M}p6L!j#oWGrJdy?(?>T`^u8+st$_ zozzNN=V!%f#R9itQL#5;)&%5J66@ARyfm2u~i#>`he!y8cc zYQ0>sOUrf{^E??>(`c?bg=8|T*dH&gSGG#=q`5_C|o( zT}QxEClBL&>Tx7b;c$*1F%rpGE|$fA8b=aGE;hg;p2ctbNKd<_w>N8cGV5ha0&}I3 zmn)STEo-fABVQ<$Zm*T=f)Yz!rc|<8l~PIG-P5--J?D?~oWCp5el9d6oj8fyqc|Ln zbvBVqXGayUZG&;%yMV*_2_)NK{1n)!(_p2}fQ>2?Gj`HCyU!?Qtw*c@YY@yrpEYC+ zV-@7A5o-^A^VX=f7rzB-%-V1>xgwf ze)m|W^#FcHt#Ru?{O+}mTF3A^Mk0^jeI)bv-EW<+9>(th>rt>Q(`ds%s{rVG%*#Bl z7k&E~f3+Au*ivSI6U>u9j3B{Sh|6VHU$(a)TYtU1otbvaYI>>tc2+VA?Xzzu znM2yHt}>5%NEeveOG`}GZKQXX>qu9v#aS<7*^A}1x?3S4;U9l_$l@isse(9^xR{Jm z%#FKPgj>ufEv6|hH7rY`lokFZUVa@kMmk7palKh3b*`eLLJ=Id+^pCdUGTn781xdG zF)!Jb@*2v9Ls4(FR!j~~qXmKhwgZUT^vSX_MFO%BzKium{+hOJ5tWgA2&M5KGxf`O z3$L06J*qmUvuanWi&fjXS8XI!l{KaK{u@_soJ3Pv4KNKBUgB4HlJ%MM^T+GGR*jeT zIkilq?1CXtDu-KM>OI2ir3DRv?x}b20eMtbVz?ZM1ge;_QipO% z-C?^nnO3i$ZC=W5tb&J30GE4dFj1IAFLhO}^|@td1vsv0PbOrPytJ|%EDtYcNAMR> zmuCC)i|^pv89`zsNu}dB24W*X!a%(v!KjgR=;9$8#_{7J<5ob1J!XIPT56vU`+6CK zR$&eGbhT05(A{0I?IxDZ(vltNF~kTpk6Q5~Gu|`Vg$gV6+e9+$2o6ZKM}sCu3+&!# zf}TthrWws9rx=?BguR68UP_+7$J_I|aslIi5WYOt-n0GXa)0-ClPvJv`kmnZd?x%} zFD!8e^kV(i-Ch{EzdJVMdJsGqb~L6eT=Q3ym%3A~ukC=7dd zZ~+rru@A+pIJ%oCKNZEY*MK0)=28_*rs>N#Qzkl#i&nKl`Jk*e%mzT6*rj}@T&Mp5H)eUQ##j5UNgSL4?c-L+R*nCzRbb&(np4parz1zd9SZ@ zu-+YQjBy!7->YSnPlTOKwvPmBc=w_qlqc{EkIQ`ac_duUB8ZM52jP>{qIs5Uu4X`F znBs3I2B9I|Jd8X<(-@!eOM=~(`{#@fS4q76yWz0?-7gVBykkaZn;>cdoc*bzj5P(6 zZke?;FgM{sawKDAO+UU;2J53bL1CVa5` z6z)4iNQ_JllnMuggdG06xHnQdoGhYS3PCbiH;{ppCKKdBN6?8wI*V;4tk`CD!6J5W4^xwY?3P5yEMz*UE|Ke7p~QwK7E_q8RC_I)uxEhH$TLC?!gx59 zma={FUcpr$2QXX0-&K}dEiCj^WiNud;u@3-T{e!Gq6akwQfqfS=i0&&dnwVKvL&iA^f+8gQXXitt3#G zf1JQ1j>|Zln@BqG%|s`rgin*HOv?JvQwOnmC8;Jlm{bVS@s)(Sz=;Oe53zbH0dadk z&cV&;^G-r2)8C6yrptPAfO$pVbGIe4gNd{;oeMzIP%?nA#v-UfDF+1-=PQa^LU<@E ztcW{)2|?2s{eXgrs%YDD<^*f9*ULoSQ(-N>z+~QWrcH=QlMx~{7vb>3wJ6FpbFqA< zwWb_1P_5}sv>;H(B`Djlj{Ww9uM$#6#@&>H(8B>r<)Tn0jhI22A;!pLn*jt=p}5>I zCmQ8aH|SZ?nJ$pVN|tw9WOOo0GmoR6vY=*?ZO0(0C2D0pdM z9+j7}Y^ZyD81<5XwKI~Q6|~~ToijMj_CjV(FF%4N>?4LVip0nz1u&_Wph99O9_5C+ z4}|bZIOQSmNnVQx2Czk39%~oFk-g};9GeHmJ;fjqxs|ULN@aJf^wkWP2=JdD~RaVfXfHrV7i|v5jP?ln zxW^hqJD|;b#dsf$T8Yi!4-CI5X0PT?vBhZHsI>Vn+`Y9iwmFHuY>updH}62h_}1ng zDYr*Ty_Y?9_jPcVH~fAZwf)c;vKOPB(YIpGcgffe>Gw9D>x|w?Z0_A0+uYZQ7YyA0 z2_nGGUW`ag{YhtUXRI@_OJ9dSo&FbJ#smXLX23^}f*rxrL&sikm4(vzmjaldAZEma;aY)) z(u64oW`cTs17s7p!>K43dIDa&X+Asm!t>@TG~!Wg2$mfSs|w__O@=^ww2~gr3tEAO z(lN)mJjSQYaerlvcMj6d1s&!>t+0c;EP=F-t|WR}p;*A8w%r(dI0CPs`w80I?qX#6&zC*j4Wzr+V2b$dxM z1}16dz*&6yv=_V6gR0-oo#Sm1oAY_VoeV(QXg~4Q4M4Y&$&_%NUdEq%_4R0sB6HIo z(B`L;{+;&0Y7-K2)dIAEB9TA~UBlQoZ2$r!R4A?Fx)0B%{3lsrGO4-S53~AvzoYM% z1K|Yb9gM*2?3ex)e~Rjb$pe~+OVwLPYp=95u|B6nTw6a z<9LeC4JBA3+22B}ee^2<-w>lvj0rhmnjavx#Me)VfodEC83M_e0c4)+#KceqF1eFD zU@XQrM$>BeRaL7B4-;Mh?5`%TzxM+ zd-3dJkBb_;X})mfu`ceNh1qMljGM4bS&y}&i%R`tjFb}jiW7*Cm^%udlB47j%-WQm zGYX-#*k-yp1`{HUfkq8X#hZ!XI?f@8l8NY~N+~c!V7I^=Wx*iCtkeOclLeVhgV~bn zkb*vrCtz^ImF!l$lP;xEE`7iNW0G|HU>k|oa<~KCHVlxdQXVW3VCNjzFF;JT{a?bl zetDG=52jQrm@$>1rcS8%VzpVW2RB7-i0Tq1HTmsI2$9D*wdKI1Q3*&A#SCi4yWGGs zY}*cq6hTk~ov>|7P>nT17NN^sqhfL;@&fn(Xpu)w$#+EMwk{}ju?T3iAT1GmGa3vW z5iXqB$%2C2A>wUD)Gb7Kbg)N_5gL4B=a`THh7~1(eRA6#T0;Gj4(GvXxv(f=PV> zHX4+x^>6mAztPEnaqdv$u=;`VzWH{0<2l?LpormoQtAcFYtf@Q)rmVl-s$7L+F-#@ zzW_7+5YM0!7?QHtP7Y7!`Tkdo+ifuV!?5oBwYKh{#E8`w)b>8ye-+0o23m)8W96iE zW9}Y^5vkg!m4_P&90Ay3shg!B9(1zS0M=<9>okvF=qOO)lj!MQ{Lb>XlPK+lATVa7 zs$7+0oxHn`>l4@aSB*`K1@5JJZ?k{>At!du4Q8_=`|0vT5P9wcb9gA)?Zb5CGp! z8o5a?naFA2PQ$fq9$##=%!xD8rzek_Sh8@LS}w14bz%`CX_(cIoPWy1Q&Z+S^DKWJ z;OQfi$HT_?&4BD4cz(>7kQCry#Z{Xet^j* zk+k>VIuvBmFDc8XjyWq;ZP3|exLFez4Di(l#N?=1YtaWefj&sY5#VG}>h_=`E^Fd= zCERwr`+m(oA5{0TL1dfM155;$zl@xhkMu}&x#=W*2-O9atuqni`|ZdT`+cY=$vmi! z;F|cwbpcDgpHF;@$v@=Xv~Hg?)=QH^Ejy~n+n?s`{(z|_X>erJCI>b0|19t4yEQvn zkrh*s4rBu;^->O{qhj(-1uliL6-DOWi&@ZlS-a8*sLg1~xu?`o}-JDQDLv59!&t$by%ckPLalK9%jtCf@J@ zxDmAx5m&rD_PR(8R^*~mtmNC6&`-=}Jj*tQe+fV5oJJ<$31Yf<_L$J}E10W$>H+CP)=UVf4HK zs(x?Yxa?0|`=f#l#CR&R2owVghGV|^!t*CljLJ+syW7|(sHv|*(MfeVFuN^vKpjK` z2ZSjm5K+T8qOmp`RT?OPM8tDQ_a5%88xPXFY z#uve1e`^fXmcBj-xZQ~g;!W@%rIbbbmu!D$i01C)>=PE)%?%X&rrQizN`EN2tfOCk z1)}p3bSpRDoCu~APmpZFYsOaEVG;d;@p`QSmaqFT;S7KD3suLEnVn2yb@L(hd7KJ> zYCDdwllSx5B$B|CCR}P-zZ;g|KKR7YI}*-s0($~+1oDq^>C?1gWVl@0`?gQ~PG=dE z?>bmf0-`#rCVsYCba9D&Ev>!i&8P7S>6to?97cokT4Vu9PgZd4ogw0j}y!+&qU0|8T~tr z8UXA~Fs<+lg+SKHK+sByK$a;{{K{Hjad8!lB=VUhGIp5~*-p`EBcIpoE||xZIs$*u zKCp>>)J#il{dmJbrw?^xOVD>C9RkA{r>M4msY6fInV>Y-V!tfd&A0`2vo;K2Z$yN> zJ(}_D@J<0W=gt|oKM$t&2$)4G3Hs>`6O!^d48PFLt{{?u4>wdm@WF>#05)OE@iNX@ zqXBfQ2r8QFgf&c#%3KzQd^hG&z=;(LeojbW_l(Z&Y9A}w{$fo%f0Z|WjmfVw8D;V* zCW3D%bg3U<^21C7l0JjnWI+Rw^g^VopW^**X2O<2y5d`Zi0A)=$tRd_MQLeER#0~t z)o|kz1U}+g19VS3SCNti(nQT%;MGbk0ToF+_JhK<5A}fRHZeK78->%vi6Ac)bg$oE z+Z7v*z5e=U>o8fr!a}k_h%~;1jm#pGrJq+mn-)~^HKiMa?9Fp8y*L{Xj=O?BcM=Yk zJMNe)3eMHF)gt_uNiJ{^>NkLEDY-~}ilH-xVQ^0YCS`wZF{n z`MCC>-p+j)WIKead0fWfjG>Y)vel%-iqlt62WF_1)$h@eGO=KPP7hMhR@da)JEA#(Oc{#YK3lLtdoEaF3vh? z`}n-OUr=vvNsWL}_V&-dVyyoZ-q4RH4s02C%co!x%|qsgzMxiEp&@Su68(6j*ZsJY z@AN}s$FzVRAodK}0HZU29t@!6d9?dhr_j^pfnC}>(9`DpmuoTFvib^j4CAlRC-wp~ zCI?{}jjJJ;Mh9UU9mnh(svUOk>kQKP0|W4p+Wpo5&H_^@d=fVYKQO3Gr9yfJw~?N9 z=9qJ;<{)m&CqaUfLpr2-D1i_h!PuV!n0eWN%(V9k##yw*R0B^!+Y))vlmH1?;fk0- zQ5y1+^hfrR3V{uAY&l;YVG>I8&sh0qn0!AIwysN^ycAGg!_k7{ zE4T%%;+m_tT0}7Q`XIIV;d4X1G>pAvTb)()8+_nrm{7~CX_$DmCU7NA8u7#oX^AxBwIM|A{r zk9YUS#`{L_djy)sUi9%*6F~Jvb~0>ufRG>NRbud;-A4A3AbY%8!4duuQ(wU0%p-}4 zONjGKS#hLk9GOdu`^;VfUMlvRHTJv}o%@$`*zxN_$F`(Gb_ z?Zo7G=eU36EUp~KmE#@%!XvnF{+5%&HH70mJo$8P8IoB~RZv0nRD~5Z{+rh%!7%)-DN1$W66SWnDIlV@|fJO^r>7`2SHWWqhX|F7MDKXo^Xe<=? zH-cj7A2An#x@PUjZw!NuIyq#F6tyt}Sas$4a+ubxyt(+VC^10f!9f=aKQfeBiDCf*W6_`H23KqQnO&`7j3+o;^NkrmVAC zgyJ8jC;0{0m0v{4$#2&Gr8EQ2NfO0Xgkd{c`aV1;pv-+(8 zc;m<&n9LwAbyABke<8#I5{pYIW{@QqHw7aZ{5rARM%sT8POvsbiUf|?5-nrk&|0rH z#kz>4M|Tnk>R@D`y3n(~o1Lk=fM8A5RaNFV;D6j?I2{9o?I}?SST-2j20~Kc$)?R$ zP|8Y#q6?Y=m1|vCdNA;u_doG)Ztn$m#BD*X#FMFBasS+`!2lqetTLJC_!+3pyNN8S- za5x2)?}J7NBMk{0w#T&v&6NBY?qGri>->ABZs8{w_*vJ}-#fuF0!P?N%1TBi zn@)pSppeUdG65s8kpzUHTz9}`q2<27x-T-h#Ds{)i=#~$`uKo9^J3S%*h^mQRrN=_ z|8JRyNcN}9?Pu~InRMGDIidc)j~g*IiFzuAXC{+laKXst2jYtNDmcPFQWO3;--To+ z4*->^0s77~_3;D(HjjuZHEZ>~(TC9FoRxAC?Yaj?Tu z4Wa>njm+z(UVM^PIvVd7A1Q8si2OusHBp?o)M{DMIOGvg4gvp$j$x;{(N=+Fp8*B5 z=M(Xi;XKe0qhAw=q zg&G3KlS^=#_Oj0)y@rblkm0k*zl9vi#ug%ABoM@e@ozjVq3n!fwlOpYOXa(1XrM6-7;KQ09l63 zQeO^N2?J&Cmf=i^W@5QusdSx7dz;1c9ZfrPddEn9IfFv?forpqd$cC&F99Pxnk+FZ zczJ9nv1I$e=+%GB!K|e#pAEy>UFLSdes=Y z5s(#H7PTIgxm@aAYjf9NU#=ioo6jLbFV&KT zN)o~{qI_7@f>_V!(X4#{U{;%hm?6O@WCs~ORE5U93S}tZjINXjSCp`I032d5rX!Jq zGLgcN+6%(yIuZB=4opMyjn>UEOgmfhvAvg4<>r#D=jd$=nwQr7LnOC`j6S$8T`AiQ z>PEylRZQT%w$zJNcVle4A&h~I=Gwt~Xw-AaofzOAhD4E`jkO=z9qsOTIG_%wq)Q#h zE3HfXHYRomTf&F{LkSQ<1NN#~XRID|Yz5ga2Kxix`q5W>u<#?9yMbMEP_laP4d<@~Vy32PK^55U0`Rczj z`5h+TfW(jB+;v3zORO{)&Q%U4X@-%Z)(js|dcLiKU@Eim*d#TD6OL6%H5Ts-hKgkJC=H&??xU=Ty-6J^v22*n8W zr-j-8%V25o&LH!zA~zr7mG>Aoc}DRrxm{0~fS$0Omn{Q01Mo)~QvVw**PQGJnIqwh zsQUgJPZyZ{HIp>JsOtvOGxjQjyMb8VwI7M5QSen4Y1L5KCMVzsGBgWO4W@Zw<{4#A z_X?Ve+T-__ln9z=pS!g%0VaEG{p3XTmi5Hro%JUkFFpQfr>q*>f~j-2+MIagZ0BUT zVLkrnWT#QCw4C*mPv5d0p1idX&M4Og51CP}G>k1)1m}w^O8ZI(omW~ARkaWZyo2aO zLMUWoFeT*lPWqcpRKkFcr^81fNsR>MN|wzn3a|{6ht~zbyUU1qV4AW@{frpDQ*T5`v)+_py`bxnQ%Zk84mI zXFiD8imb-J;i>r1ypG&9W85crYx^4XhDl_%z2>_JOjM{FIWQ53>7%MF3kkJ-{2rjy zTSLfy6QZch5UBbUWT0OFOhMBkIu=BA;U5-#fh#~wVjtlyxewYHbrx`!ZGM1orJl#$ zPy$t3F}R~XFLx|*9E7y3nDe?^x!Fm;xizEea&`qevjLp7+KK(IdIoKtv4eNBVIjS?{1KIw^~`Nmv`vNOefrmL9|?m>jFL8DGprovdh@N zi@d6r4M4_AGNe^CF!Wwx(OrEzHY4g)QK)!*lyd9jRp;6d>epa1DC`;-Ix6Z&2lyIl zu#2la!LC3IpHSG8(vYgv059}wE!b_mOZ_~Pf5GGznEX#BZ!-A;6T&WdAVyKDZ{dY? zCL2f)iA}|dhX|+UN-?X)4T_rozyjOVX^%7za;OF%WO3|$bx_Xx? zU&cMe1QGL{IsMG-(_(2n3rk}jzS%zwJ0rliO$>_Y=5++`8d>ScxBz#7vkHDQcCgBvQx#jux22+W!vB~K{Z5@{plYdGDu zK>+p_Ky4#@QlNY{8zWdhet3E@Zg|k@N0~mkJK*2#qmD*mt%te6EV!4vJ5t-z z$xHO`8=XEx8#7p-ueKMz{fNmPwuZ$qU;s`85;7u;^wnuz}!$+QH5MOTy4^V)-4C80e-Bj^JGjvC5nMdJ8P~FoF;YwBx{1 z!=(-92|V|+cfz zlDO-$+sorU4}1jo@SCrV(~(0swT$M}dTJvAc~EM*4} z(@cYaUv5KNS5#?(RT8Ha1*go*&tAOw($zT;!oL=kJM87BXR z$sQ)ccMB;X#-AL~79tVi&hkF>Ivq4mkFo9D?n>YCvMqsx!4C= zRarJ8)yAr9ICs!~)6lN86>c}GF^1azj8uc8Vf2lHg{Lr$r~`01q#pbw7sTLO9cIhO z269KFEG)rX9CU>{&rl3!$sgQ5<#6=CV)NUzMIi+_C^>MD@ok z@f%D8QpAqxdoTzEsJi1Z%*vGe^J zXgKzJr3v6()tP>EplxulZh<#gG_S!>1K$*}L$F@#%XYF3R)V{s`_p>w>cDpB5wfjr zH@&{F(Q|F?H)zt1?AHYIVS{YJ!X8mzX=w+^ftTWNsBXFH>G{I8W*jF9~vy zUCOY?RiNf!!FR9_JqF0r#)F*3<)ZICa3yGs5AC5xROm-Wh{eLxVuI*IV^9xLzSTO> zKMu#_C9SQ9?AU}jCXh4-tOhr46Wv!R#R*fi-K-wg?x(!j9xSYZECj)_PWh9918b_WZXr$Zs?-=jxWkX!ihvGag<8ZzM zN!PZp{*AQfYw`%~!5wU9B#uk#3!N0si{cK3NO9T?)C9_kF2Q#ggP{&vCS~NRM3O^< z!=4FNf-X)_$QdLf86wL|)`bFVlwFbIrtGsOOGR<8DGtqkS| z|1ujCqu|5`_rW-3CZmpm$$^hM-3W!nfgKJd3eG6zW7KDNQeVqpi0*XGN`No)e4j?g zHDWr+S^G*SR#+aH*sNxbh2_ECVAzkJ$!R8MmCwjdLNsKFxOJPzG*P@xpL6n;jB7UcsgC zk0{^*4#z|i+o}9i>&5&$>``My3aRq94c~I8^D% z{7`YwUD?kuw0$`UXa#L2rS@wjbp|D1pljd;YFiHw-NPqD`q`*1Epy}4@)9(KMBOm9 z_)j?4hd^WJaB*UEwiBuUzaxa!2`_{P812R*(>%R9poUa|Zl*j4r_LWD=~4x)yb~{O zZ~gNSg@9QYy#pNdIoWL_fo%elD+%W)j3aPBw$j+|=F;t>baS=ffQ+kfKbGg9awA8I zy>#+#!dL@y3HBeseTG1$5gUw6?x3*y7_J}&M|}*DDw10SRzo0X5^o;l&KoG3k+UH= zOO+6fM9f#~lZc;T#P8rUA+;iF5Kc>$PABY`?{=2Vg@WBo_N*GcNg( z54I8D1~T1!U?l7jF}wT-2=~K*PKeqjKL8U{{ns&q+O!~8=X-eieMmfnTZUf_f_A`O z=SP1W34a6*Bt_8?mel*}3Vw*WPcdOF_y$D;($%{Fp0e9OH<(3)z`&O@q;gt5`~<6! z(8?cWE<`)RT?k?O0O3az!XRoC*GGU2<4F=XUv!6fA8bM}ju5*jj76y%eeEysB^Q}o zVnW!`NKepT_wABjKeyQg+CH*rmO#g=3cUyw2cLP z>53iG0^05yn{b@Eo15$=rp*G#ehIBrPY?(xS9rN9B0;s@Qtjo1fr|*fhY_;X6h#*l zWBzLcZudz(`^zXAP`)lKu*Q#LNVMmAn);#k{+=o93KhXPQiRFkxQxTOfduGAybQF) zN4^$hhR7|!ZHc%KHOyW3#Rx-4UV;Du%K-DZVj23p3T9X~@9AMoe*o{$TZg0+d*jJR z!=iAb7wD&1j_Y`v8;dMPVOhG%K~_QyC4Z2;A3(+cR|#DjwywkOAh5#h7zJW?NF)4C z8D`}Ip6Fe7BKNVn${`cVQjFE zKoVNap`r%&;WIV9YidZ^*%2OtIAqCT!XsJ}(SHB{xUB$mC#gVpqFoNlzlE_17u8p~ z>VlSNwMcLKc3WkC=gJU0c%ldqwMDNcL`%yGBa7XQXpI2!3&(*7X4{|ETm)v94bBED z2*!an742LpRurv!>1sK)RmBrNtG#bv(G@ocxCMrl(dSc|Z?Vy+T4U&UXdOT(;)aRM zI|(^(-%V@X$$744{rN9!kfO02zo8-6EtLsjxe zY!-lL4>j0=L!LNK(!j5sC*!vSS zeiY~c)&be-4eTZIamho-<`#NnCv^!?Z=}>)5TxH)e;kY_0_9Qb2{>P1M{d}VX}`v1 zd7W&^0HfRYBBmDM<_p*i57(HZ%7gWzCWz(gFFQFNcnee~m|3<*f9LM!v9oo)dDKd7 z=GTvi8eoj!@}kVeHhAjScppOhuc5{~`jM2aM+>Z_0zoc&H4;6&a%O1?^Kcw{Whoa31kd# zmfW&K^zzu`ipC^HE#ZJ6i1|W+jx^*ysazo^%Cvp|F5nquLAN1#LV(Qv1!Q~$%cB@M z!sm(2_{I<+l%EE95zaN(iDdv5>I7U|9@iFjY&bZ84F>_gV*B~p?zWTE$`6^16*Nz8 z1ED`9rEPjL*gYHqOa3hfQ8)y#-o&AKq9;;&a+jgmT>_jOxHr2{VOzND)Gso5h6&A% zFe#%lZLpE{evx;=<^{;*VO}M={IQ^w++M3NR7ho0*v@xK?zQg^zK_uJ{ftwNXiZP? z{rC%aWWqNGz)4qVU1nR_XBcEnQ`q_U-@1DeHbBHx-$G>ciHWE93Dn7_c^_7L#5+&& z?&MK+EBr&#j0-sALo!ir2H*a}mcIBBAGjDR4J}Gahm#`&4Pq>9J67H*;5VzIW5Lnv zk?#h^5RlH*HVTVRAggWYn5*__p+(Qr{?ntgp!^tR8hvJEHbh}02|O;du@n?LvDGv~ zD{0>$Aaj3DoB?IwEkaU*57}7(Ee)RqYbE3rtpzg`eCjC@k z4fc2+X!QL6+Nd$R|LM5hfS7FQ5%BDK)0PxK_dxHUb*Uq}&%YFo5S!n@3DwrH<7&?x z_!9}eftsNcheCh~ZEV&H6(?eru^Gn|`h8;6&tS_`Sa#t#it_xH0u>u5hwaL?lH$h# zZWYnG@Zbddm*;gq<{1`XKknpH;XqxqV20Q>NaW@;v&3*a#*Tm^k&jeq3`_Hn%@`hJ zF#A25>1wy(yUU0x(N+dL3r$tmb`X){G&dQYAif)dXt#8G%$G~Im4frdAvPSP16u|? zD5m@a`|Cy=&(33@v1KB_z$q(_3GriA-%ZP9j!cGS#yTFb> z&Qp{eL%4a$z=sJn++6wcaMR(JGN|6_>q1Q@<(x*1h+TThpc|zRL7xpF=qCJ;`1PXg zK;&-|L<`lI0i&>@2sruP=l?HYgs)tqSrJIuFITAJ=!GTI?}D^>cYwsCOgB?-u}aI2A>fRScaKHbE0=)^;L{zh(DnMu{$X~GQd52Gh$AJq_9+2>kQSKd>&3MZlw)A5Rw4!09J8AzB{efpNEnes%}t@3!oVI-VVGnDGAWLiGa4|eoT1^ zQ+`WNxrM9#^k&sG)Yb4vB{vW5d>ULN-74bk-wr2%41$o0=%OOd=kDv2VDQV#AcJS<76e-ezoY=gA+8N&j2+{8W#Tl3S4@&(KX~OqX73J4@2es0y z4t*uQqMD##9Z;1le>f3QO+~(YrN8e5M^kvn2czc4jKIkh5v@Lx0zL((!vFdY{TV_a zlOS3#+uacY5b(FOx(U_~_bbpQ6R;BY^wKmii;uRtit33=rrtOlA0=3Z)!n=tmNA2S zXMjG!cV80=OQ3Q>VT7zzvJ; zKmkijSpgivabPa^tI13qe+Ru@bpAM-!JJT|D>LZhBp-_SZKUo*?r4*kbfZP?3D2v*(`-WmZG6>h^;0c%_nR7I1 z6ig|oQTQLCMz0S`sm z@%hfs6-3Fr_UPs?-adxtj@af%XXLH8GbCH_k48TRW**Y;T>onb92H(&4UsSV=TA2&8fH}`f%J9}ZyhpfHAal{w( zusJ6pSMdIkFgM&m+z#&IgB&sr%w>bS@-DOvTXdq;>&4Cp#^>hdSZ6Fc6L|VVcuN9N zGh-Z6P|bbpIUr;Eyo_O9;%W|Mhw+6ze_q~--=33=H9=u-{{nV6BQF@M9YQ^^&3)_B zoqc%cL!5oI53UHM!dPiR&Zc~C!E>N-vY+bxehaz020STXSb-%B;p!AV? z=Xz$oYk`YI17@JVwqtikZpqgv{~2lTqn zhiZ-apbpY>aAB+AcK!47gt>`H`9h3l1Mb}rft(Vob~ogz1fNHO=M z@Bg8{<7-8kT%XP9X?4%&27?|M&wx!5r)7tJAb}}Vb4pM=N5Y!mgIsQIY+vLnO@zP_=rJRKuD82#+liSIGwrlqj_r)U9NVcG z%f2(y-tSM%F@PFjCKUakiT?>u`PufKZVZdBG{zTaayrXMuQ@NtmF}fvw!8$YZ6{~& z0nBzD-(U1=#K&jwQAZ4+7V6+vgD=#Hdlf1hzN|lEp?kXlKlfrjGF4U*zUojH4<=dHAh76u6BEc^F zYuq1D2G}X~3nmRu2Q;V$=UxUH4lYJD$LGmEiYBc%B;i2-p5Q}d!bW;&*%HDj?%j38 zO!}XW{4A;|<|8OvW?1WNe~+(t6)(eVwyajMf7>u?C%ISHjWi+vz~>gzj{ge;K)zS> z0*oyy_5lU5qqz8!avn~*5*9bs)L#b>ZJ!Ky4-1Rf#-{b1WL&=m&l?A|)X(oif?17^ zfOUnY4_}T9LeY4i_C;Q2t^l?c8bFi}?vTmlzKJ@ZAKGQ?ov4GM`6X)RxEV7UWF6F2 zi0!AvGJXVigL1W=HUen*G@c#k+j%tlrWtUTx_e`2IBt^P_i5@Pl2_p4Uyb>Cc$F z&71k_4Z0_4*R4SdpO=8VAmQzNg1fGWN4^dlNi(>s>~D8Tj$ixX(-%uom7;P?@=U0E zQ~gY6x>WSPQI9cU`*r-~2y+a9gn13ov)rUtuPM5f>973#5Oe#G;A4PpwXXN1JivBhw|D3sRW%4B^ z_p|$lnLNbPDJCb8cxmi<2tO=sF8w?&|0a{)XY!X!Bo5~+pA^qIaVU9)r$i9m;Oxa0 zu9n_=_2x_0Uz{!7yejjz+q7d>)JDr%tJ~)}#uAUI0bRZ>2=L@qM^t@f0p3@V-1&7X zftbs94ggDF1)SuE?jQPk7%UcJ4nmn-oP!wnzSr)8iSBL_?xxc051vYVGmb@~(Gn*|D@^j8-#Li`A4! zHM{BRrbKm`K``>pZh$11+;U2C$RPoOAjmP;TyxK5v1kN2B&P{-$|Zo2L%vu2Lt2&x z2@nZgU0q%Ey6U}G-}@=PKRH=8KK+N!;@^^_f0M@kG}J%A<^Kf=CT&PeW{M+k$l|VS zDB`YesN$||XyRVjC@__2j@~V96lDqZf@5?`8zoWKopN_#V*>T!j=WK^mCmGHJ(4%3 zY^^iR43slR%El@2RH7$br@t?u?TlUMyulP!{+V)K+L--;#3oqrIq2ADkJOEGOj(m^ zm9SsF<5<3La=XWE-*$txyJH5sw&}F}!1P*XtL@mn*>+9KWN6~;?S9bq+AUFdw6|9V zO}j_L(Pp%KW;Z=%qh4ux?!L`~M$Za%W8BqEVCAc@}~-anTiivrW1OOQp88My1L#LBoA*=1H? zljvcvDw{$}iA}Q^+{^3~JB|AU`%U%+n?;WbGuc^o4z)@4COgkApjKrU*(LOv68yfx zbxa`q-P_05yWMX)fw_HXdah{?dXC34F$ne_`hndwEtior0-M_meaj~PtX|JKq`vzW zZ+m^;1dGtY^+_ZLyH;Qx*cgP7kSVw8V$f=n7({<`C*It_<=;dRNFBMOh*FK@-Yja` zk#r;<$&u73L{g`K7X7S*ry`>^BPbowQ<=%oCnaR!3pBO+ZaZjOPy`z@hXVP5Ma~HRutyn}NpQ=6ADqZw*5pi zT#t7}P2aJD<^hW}A{nc`-HUbTH*_&JEXNT{rRE?mh9j&lP2y_o+b;9?6740Z{8Ben=6dfiHX4mKnAT`qBXJlgB>l2nm329s z$&|jH^=Z=Pp}#6FLLMQ*ze7c!iqw^da#tBDU3I9+(hj;nO4?8(84e3kVMiY7k>1gV zMU=&%G1!lE{?}3QNE#Lbqf?3sNAj>V*o;bdrO(%gWwez$6Hy^5A1T8LJW0_6dQ_rH zr!t(3NN5G=KE!2iZDr!y+9CxZq=NW8rytn4Vv!2CRu{07<5$ZA!I1)Sfjnwl zTx;B4d$RI_q;mKElce%s^~bBVDpVq{0)7@O<>#n4PsKD9q$aW2^PpDPfsiOCX~ji? zJt#0Q(UaEk+HPF*gGLuP#z{uCDnE_eNi<`Pdmi)=-)!#ji-JI}@9)M1v6NV&8(^{T zI8@^oL=Qokv{k4qe}fu}wBNxdm?z11h0TY z8^D)B+5^rh*ePM6R6b`A*@)VNhJIgoF*po8j5vXJ^{LpbuTd7{7($=hDyRmT-`s8@~@T z^b46Z3@noQj{*sxqz*1e3fML~)P5mFYN~k}bW8!5%s&MqBlVFqRD?m7fnMz_;JqOCw9>1E?g5Hz@Q2{Kz`210C^nSHt(L#ofb&*rk(8n2!#-%(DeYu6J}A& zDUz`Ubx-B@0U8^SHq5?fy=p!h}N!{1p72(+=Y5ZQqCQ1g~m^bC1`w zSOalCmKjW<#o@ihas&3Sn0__^sF9+71cDAOzk))N%W?(RG|JG-)jeThecADvmgC>7 zr=)TdMQ#RhZ4H-CP`ZOve?C2w6L%w$|48~{<(amYXcjasUxnD5n4MC8ccV-Y&@Squ?}ax?*#mP42b#b9dG=}Jq0E=SCVKtwYc$sfZ(i#F4F{`gI$82M6YP9W!8vGv2ZBOC%2Jb{F zz~nM~Aegd9N1UYop#q?UL1S8^3s5niN?*(FGR71z#vNP`V@`=N=#z{Y7N4z)erM26 zN54ORg?3TUjs$HZr5!z$+<(Q05=Q*v;Md0}ixHswH|X_C^eXQuUrYSI2Y)O2nc1u( zjZI+IzY>%yksfJBDs=Q$81)rKO=6VH-x-8r)R}DF$*5uRYx!9PJvY&_DtfLGFW6L6 zAgW)>{+EL8G(17TlY1TgW<TLMCUf*HlZ-{WXg=oVH@`+GjlK&AD!6QMqYm&<`ijJ|4 zhqqVn-&&BPZy}#V1BqxT zG`z~gF+wTrxUj>mRgTtA& zi?m0ZnHF>x0sB>6)8lC*C%A8u;Z9Ts!@`432F92nbuVQcP6*=l~r-00aKS}#gWfPh-)NmDmXDXZB)A=ABU)huRR-m%U zNKMg4WNa`}W)qYJBPVdExxa^TXEE-V>9}c(`xA_t$;Jg5jX6)f3&`?JJ*Tf%UZSxK z8t3+Opz?p@Usw6RfXe9;sOWA5Z_Z?I5DjaHr1chDp4$2F&+^^+Dd`n54&&H3ieu7* zNv;_u0G3cp5EvW8g`0cBylo2CiDKeJp%(IF(E`QMAiF@CpQ+;rLpYgw5i;{nsP=sn zFOI=O{+ufHi?RKg?t}5Bv==8;;G~4BoU|i+`zoiT54MnRE~gs(-p#!FottL8UeDbS znpf^ulFuOg$_hDc81z*P(Pg=x(jxFNNu?bnG58#1GS{@Vg&2Xmg?z!FpGQ2sS86!dS z$Mluors4?|l6i7lo zr|^pZn2HA|kZT?3=kb-Vpu<1m@^7G!bOUJ(IPBtIR|v@}iUQQC$O_UQ=jd6~D)Kqt zSW>U56(v0XTCuM;Nr&j~B~O#YzqvI)d2(kU_J42JK$6$#XWzrn)=6IZt`|e%IP|4uuUD*`b;# ze55(bVT$~_KZh+n=9~x%Z_cGVYHq=_%%8aJ!J;1=3Kzv;O^Y*go@{2a1; zM#Kp78kora1Ewhb<|7+rS~w!;A~5SBo)p<>@oKK+iVx4_0Ec{4-$A-}?%JHlXV2Z5 zGZXg%RNX}%J0Ce?v$>1ZFv11yFTgbz>Pk)u*`FS=KIDZhGMkcc`1TFc$8p9k z<-1#5f}J&}y2G*2Y+Izh%xP ze$9~9b^X-6C4_cM3xF(ngnT(A|R0z5!Xux9(gwF|IdfN^T zY}?JrVb)#hmN5g%9baR62Z?@Y8AgHxB>^ehmyad^wfzRSckDqfqJE=$IQ=$lQZH79tRQmO>FLCzUpBcW56kE|Pm1 zaLa`f3jY!Gndd@iq(n(yG3 zl10MAN7yhnEX{$flM=VH!#?84v4r`()pa5EqpjZqI$Jxmm6Fg_M9$fv^T;K=w+>(8Ge|PlXkCfU zZO}6^Uz7qkS@-x)(M6~o-=rEHc^=odAEK>B`bGz9QU&^k|5tVGSn!tX8XY8%D|-i* z|CgW>Y5WrTqXDwQ{2ZlJ$TwX>%bFButg@%^8_+QP2;fNW=u~dP2^iABoXk7)hWZZ; z^qoXsH!?a!I-KJSHG{O$cZ1TGva2x-y_8NlnCMhGlNecL+7a}5SVFK;*ef9!)B=_2 zp3MJVd=c66VOe|uUuA`03Wt00ghZjzaKgQry%|nK6X`d9jau@}f2MCn6BvWJpv0jb zO3db5Iv%r_9#*KNv>3i!WkozAakMAn={hr_5)P7SrW33b8E2&y=6Y5d8t%K1k<&Gf z(KT2Zp;IZEh$=WrEVlGn8u4*NU-(l{pBB`gr_@0eZ!a)9xWqRSs;odOY#~S#{8A%) z1Mb$0brIrPPm!5oFn`x}oJFU-CroJKB4s8Wh-&5dOt9T|tkGcsC3}%Lg3ga^=X7V$ z2F`#z!FyrO$Bh;_6$|+W!vJ^WyU{ko?tv|Vh0f`S=_JNu9zfm><|x6I7=v0)32-6o zN)i)hX2hIN>>GTzWZ1aDs*O;D{{%WM;xzst)#yNC^@Y3{Dw~@xVRs;^V2tB^I}`;S)R zi3a(xjlhFViA%uG06#_WTt1Hp#|FHT@r&+X7lI8+}mUHqY5zx?E96&0U=#KMUBx{rlN_cS;$h=~<^PCJtG!#M$ zxS|6LI+789qYzXL#X+0M%v@&3p)-|o7(O?FK6M~tvgJ4q;zUW9*isVPwX3?Woz_X6c2v#S%?Fzf3~@mTBnZF@ zP?k7gn+ctd>7mD-dgyefhaP+At-bZHz_lk|J3Zyp-&=qb<+u}(vk!~?c)RcId%yP< zm*?l}_J{xc>zY|10cY?^-ytC3 zJYk?swK$dRXFGA^2K^-TiIbNFaa1(YOa#%ko9!ol+GK?lMD8xuD{4WM`63a1)+Roa zUmcZODCvJedypk%+W2FwrTa$LIv%4@>Ky68%16>>|`~-L%<8Sbj{1lXV zoG)d73-?B|OjY3;bm~m-#Dv1<$km zRsI^D&-2%L6VG#e0mpN(sNLE1!hx5?VtBRg;CI^zgMN@f{r;p!p53NYx#RCajcE#X zr>k;&TZQuIM^7q0MoDduT*+CFjDT(Yl}?TA6>MKnk0jqjYl#SUz06Y_#Ikjl90!TAa*tC$M_ZBK*+zQolH8nM^-u>3i)Rz0c*5&D?HJ);FI#u+ zcAPZv+d(Jr`9+7MOdU`7P8i2M0N@~@5R~l%h)`aVAheW_M{8{W(5#A4VW#mww0$(` zsULO(`P5U0P}nZ?7G$n_8J#IbV#TbpSp=F4m}-Cq87R`kucN}*Nabp-bfF9U)zeBD zUq)K_mO(FF#FU;QuH+imt|{mtGuDScohspdKa+tNy2zZkBkSe+ zYoxL5XYORo4a`i5wW8~6i5+J)8!jE7^X$;6e#o*(M^ZnFsARAX*alltxH=}ewc)Kp za(m8>7x8c=9hsiLbNk+XCyKf6Q2KBn@6h0}3xA?~0=w|COh9NUXpM%;Y~yLs=4ijw zQtx47DQ#8Jho=rpRE=nB)Qca1)o~Ol(7#ZDKrCZpRR|og;>!FiU^rA&yppSQ#5a`v zN@`5a?Ep#;Ym z>A%rGRwDIdtVgLzw?0-zCT7j$CgxbV#f_dV{(%-%*8arJkr6c{U)F6@e68HfjgDIK z&aIq{$wlp9XL<;g{BTgGvbi#6bC4a9HZMA*;XQcJ31Btw$OjK#mVPwlfWQs_*(dAt zg@{F!hLBGddLJwb-ACe5*b@fB=hA&-h?bBsz~1yPJTGvQP^iVF8yWDRy6rH*&>s15Wq4#Clc#UXbiOO@71JWK2B zs$(@hnc>br76o`>UA=37nq&#&gd4-t8@21!K`kQe%lBZ@0D`EaB!B)ZTbx99J7FrdU-cJf=eG8r@#lrVQH zC`~0nyDU??8i`6M9Fa@G>0tOkSk#T4nY<-yX3rd{xthM4Sx|;nIYTu@d`x3=Z5fUk z)usE$dQN$zw(;I@DTp9sfb4skXs?su*`M!~#1HA6!cDQ@g=98>4fvi%CoGk--pdr?UJ~Nm~&!+fQy_tB^b1l7|>*@8(`kdvuxCL!~kZaH8n~m$==T%l*B3^HBa)#;3>66tzD7(c|9w!xVFCtTH7xySSnv77)Ulm~Hng(aCCv z3TA1nk|V_mn|gC|S;_U>9;;BZk$$=&H-o$hpW<4ZeW>m!|*1ACwNr35l---Z`_Al+^yWA9ruBS~@!P#G(2~+^PJ#8G zVY(?{@{L2MR_@8i6*6vnVS00Qmcjku@*qkFNfHaXRL6-gF} zB!w0yX=|?JNLG=SHu*L-Al?BfY9$BikuF}FF-<~y@d1s}AhonqafjM|CflF@Ddr)$ zrO0*IUL^(jYU+T%?dMIHDTxiIugW6cRTQLWC!eK+sUc9tLq$dlQs4vtWKO`4KbKPL zTQT3SGOF@8o&xfD?Ck&y{|ruLHpPag4{hLJ%ybVEW0ZTikC|kQ01w&=>zU$$G(gm; z4Unuw=c-;6y*H~~IfHruE1QUO1XlQ{L(wjm$@Rv2_x~?$>*5Dkx4aSjh-&iC%1pTw z_ZGDhs5}iJ76hj>;VMaIVAQBXdcIDoYMXT?tw zt0Oo28!b+Z6gFHuv=ller;X+dg3Pn1yDsvtK}dN`!*w4Hys*l0EZ606+jYezjni-m zE$qoHuxM0QMO=?MabZm^jt0`aAOk9=g-&cR4em{$8J=8SH?8VUDF`5iRIfv|6(W>V zNfRrBB-wztOXMDrUlRF{$VWsDY);n5DTD<=@h_#jiLL3H3BaEHH*i&1)W{?3s=cn& zYj)i>>t}7uMaZDhNGo4~ zuRBn=+(*U1-}Bo8O2+^e)fJkURWC^00dVx4m(ELGq6f(=*Jn(x?$vUUrY03t!h(UN zg9JBfv)pRy*tcfS9GW~YN;&?HQkrXxjB`P>&>$nactEvZ5&0CPFeTn)rRfk*6gor; zD+_a7q*JhCGv4YVQ!O_}3(PD!wG@0=EDirAnT&K*UA18p_^U{?Ra0C1t#aXiSW$Vi literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0607b649465f2dabfd75428f17d1269dc17f5a1a GIT binary patch literal 27082 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 WT7oz8FNvD7gCie{@h^iC&i@CT{_ZXS literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae26536aaaee754631ca6893ab8160923b342df8 GIT binary patch literal 10911 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f9945bfd33e7ed9720881435f47b30685038103 GIT binary patch literal 10078 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

cD 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79d944e5cbfb2e170df1cfbfcee15e525604e446 GIT binary patch literal 25042 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 DTu7VX literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7827c0c7b617c43de8340006dd5ea9116091341 GIT binary patch literal 1092 zcmZ8fOOMkq5cW7po2K1rK|Bu2AwmLC2?%I+Sq>}2LmasD0^*TNl-f>7H!p0rYF9-< z?EV{msno)>h!Z{QBmbL&$gX*V#e&A(HxnjFXsf z;Ix1k+CPmcceu;FsS`V^ZPaxNxAbBU$SYEXE)kuhK#qafPjoZjUGAJh?7blseN9%r z@M9l6Z=h!nJwI$bF^^vaWk2o%;XUr2lGs0s2n5Uq@c?74V9XZAd^(E>xQBj&jUT7a z$*6xEJx2qiTPT$itS<}k|ALWb< zFaz~x6yt8QO0pc2dR$EAQ{#xGmR$^O+0S{@$b6A%5iL>~Wp%-YRMFjo=>FdBQoma+ z_YR8vW_owA&-U+Ca<{yLXIe!sq9$){P3C#QZ|Urym}SS(s#;1GqT;oTc&>DjPoiXU z)}yG*6}#Q6T2$vO2p1WF0gS--PtNc&uu44kZy~pE0~9n_6AdS}^DrJ!6XYtdluj!q zWFPIA#i=K=Klr4Lk~W9kGS&7G{>g72(B?lx;dg#HTw^2K8$F@&`kKrf?asUtassID zaM0Z~$}|5G@{ho6+v)gtM=Tq`bU0aQ96YXr((-0l)jGVUMm;&e62@zd#zB+mY{rb2 zl`^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..286a920c7ecbf6e08d456a2aeb822157019850a8 GIT binary patch literal 21439 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7c689c374c31c863715b86883376d0efb692987 GIT binary patch literal 16040 zcmdUWYj7J`c3yX*(P)4m2vHRE7(IF@X+%gOsL^XQGaAiMBsIfXiBd?;NJCKrwQ!px zK(GPbZb&2s*tM6lla1rpQ=6>qawRTjH%TRSCE2RD9A{&@QgOwrI=_uYgWs{m7{AR$6Yp3hzHTjA>xspLu5G5d#9p*-YyLq~ z^O9>Rxuk3Kk4sXE_D7m;+|h(7;=&RMVT+_li9V4Q{UWo{x7a5JMD|l{G3}YZL*sqm$Z)t0m{DNy{%0ph( zv$l-h`qe)b$Q9Rm>wm7xRPPt~Cf556%HI*g`0CwfzIx|HUx|HUKjyK=+q0!D4vPcs zUh$GRh@5?%UEYtp1758Bk~oAO4vNF#2ucoN&WFoKwy;+FwMBqLaTM*I6vxDIyibW�k7li&2rodrX`Z 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 ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((? y, + 'gte': lambda x, y: x >= y, + 'in': lambda x, y: x in y, + 'lt': lambda x, y: x < y, + 'lte': lambda x, y: x <= y, + 'not': lambda x: not x, + 'noteq': lambda x, y: x != y, + 'notin': lambda x, y: x not in y, + } + + allowed_values = { + 'sys_platform': sys.platform, + 'python_version': '%s.%s' % sys.version_info[:2], + # parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version + 'python_full_version': sys.version.split(' ', 1)[0], + 'os_name': os.name, + 'platform_in_venv': str(in_venv()), + 'platform_release': platform.release(), + 'platform_version': platform.version(), + 'platform_machine': platform.machine(), + 'platform_python_implementation': python_implementation(), + } + + def __init__(self, context=None): + """ + Initialise an instance. + + :param context: If specified, names are looked up in this mapping. + """ + self.context = context or {} + self.source = None + + def get_fragment(self, offset): + """ + Get the part of the source which is causing a problem. + """ + fragment_len = 10 + s = '%r' % (self.source[offset:offset + fragment_len]) + if offset + fragment_len < len(self.source): + s += '...' + return s + + def get_handler(self, node_type): + """ + Get a handler for the specified AST node type. + """ + return getattr(self, 'do_%s' % node_type, None) + + def evaluate(self, node, filename=None): + """ + Evaluate a source string or node, using ``filename`` when + displaying errors. + """ + if isinstance(node, string_types): + self.source = node + kwargs = {'mode': 'eval'} + if filename: + kwargs['filename'] = filename + try: + node = ast.parse(node, **kwargs) + except SyntaxError as e: + s = self.get_fragment(e.offset) + raise SyntaxError('syntax error %s' % s) + node_type = node.__class__.__name__.lower() + handler = self.get_handler(node_type) + if handler is None: + if self.source is None: + s = '(source not available)' + else: + s = self.get_fragment(node.col_offset) + raise SyntaxError("don't know how to evaluate %r %s" % ( + node_type, s)) + return handler(node) + + def get_attr_key(self, node): + assert isinstance(node, ast.Attribute), 'attribute node expected' + return '%s.%s' % (node.value.id, node.attr) + + def do_attribute(self, node): + if not isinstance(node.value, ast.Name): + valid = False + else: + key = self.get_attr_key(node) + valid = key in self.context or key in self.allowed_values + if not valid: + raise SyntaxError('invalid expression: %s' % key) + if key in self.context: + result = self.context[key] + else: + result = self.allowed_values[key] + return result + + def do_boolop(self, node): + result = self.evaluate(node.values[0]) + is_or = node.op.__class__ is ast.Or + is_and = node.op.__class__ is ast.And + assert is_or or is_and + if (is_and and result) or (is_or and not result): + for n in node.values[1:]: + result = self.evaluate(n) + if (is_or and result) or (is_and and not result): + break + return result + + def do_compare(self, node): + def sanity_check(lhsnode, rhsnode): + valid = True + if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str): + valid = False + #elif (isinstance(lhsnode, ast.Attribute) + # and isinstance(rhsnode, ast.Attribute)): + # klhs = self.get_attr_key(lhsnode) + # krhs = self.get_attr_key(rhsnode) + # valid = klhs != krhs + if not valid: + s = self.get_fragment(node.col_offset) + raise SyntaxError('Invalid comparison: %s' % s) + + lhsnode = node.left + lhs = self.evaluate(lhsnode) + result = True + for op, rhsnode in zip(node.ops, node.comparators): + sanity_check(lhsnode, rhsnode) + op = op.__class__.__name__.lower() + if op not in self.operators: + raise SyntaxError('unsupported operation: %r' % op) + rhs = self.evaluate(rhsnode) + result = self.operators[op](lhs, rhs) + if not result: + break + lhs = rhs + lhsnode = rhsnode + return result + + def do_expression(self, node): + return self.evaluate(node.body) + + def do_name(self, node): + valid = False + if node.id in self.context: + valid = True + result = self.context[node.id] + elif node.id in self.allowed_values: + valid = True + result = self.allowed_values[node.id] + if not valid: + raise SyntaxError('invalid expression: %s' % node.id) + return result + + def do_str(self, node): + return node.s + + +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 + """ + return Evaluator(execution_context).evaluate(marker.strip()) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..75bfd68 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1068 @@ +# -*- 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') + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_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 == '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', '2.0'] + + # 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') + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + 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_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 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_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' + + 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) + 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' + + +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('^\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/venv/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..f07cde2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2016 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..792fc2e --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = '''# -*- 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 _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 = b'#!' + executable + post_interp + b'\n' + # 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 use_launcher: + script_bytes = shebang + linesep + 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 + linesep + 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/venv/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..836211d848ec0ba46667d33cfade3348888062ae GIT binary patch literal 89088 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≫*an|s~C9@ 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�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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..a401b59d602d4823e0a69138a0268f0bfbec3de2 GIT binary patch literal 97792 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

2sEA0b+{i8mF-p`}3k2M$gw;4Z-{ z%OWs+5k2*{04t8mS*?xP?wk@{RahBwHcl^2l(dZv;|(J}-_^mtwh~gsa{0<^_?;U1!Ay53w@#5t)J)5~>v#-He&j}mAX9!OI{>pyf~rWb z>eCzGs`Ox&c5f;Dr(f$u!|ZlWyXRu^r#}K7vgEba-rS&c@~VvgZdhltsWC2oT2v-D zp*1GQhDB?k^bjJCcjPxF5eQIAG#@x3BkcV5BfJ8Y+W%{W^;fwgtcQ#KcOyKFfqZs^ zK^Y-e#=4WWNOGvVuw{)dlAm14O_cnk>aY=&f^B(<%V5(M^+IFzv-#k|fP67OSaEbk z%W7U!#aiSg>v#?@#+)ZVi2LIz4&3b?jKFDU=fqvy+pm;)9+XKF5l8N3lj(Mscf$@n zbzhlGZ4{T%R9Q7!l>kWH$K%etRqBgWb#b1PdLURO1qdFI;E|PUGe{}3zbF_jpZ>6Q z*c~u*ARIiR-BSQS6c(ZFYn7&@hep;%73sBT5FLM>sxHG% z!Io+|G#HT^M2$}&;dIs@TtSRxSP02PWeB>#sq`se4woTx>d82Hb!;N%G z_aTqsBQ9%meN|s0Dmx-{%Hpf)dJoHS*n?F=zN+FqTt(Cp zqLd`^t1D!p#Sypfa=|Z=enB3;{pv3TS?u+^T=a3rcs0;rjK|u)97?dyAUNb|BxB>3 z=W@C_ZsiMcKRS9!^PB2$BaUe&IhXpDmFZS~8)9(2_E<;8C)@N&)Q)09C>&Xk$wzjl zCiS~=@QnZYyyAEMTM!9Zv-LlnS3JNPUGVSED}EQHuf2`Sk&#~XWb}T~fShhWPDGad z(pB2$pI6+AfF9-!#q4>-bK&cco>zRm6Z}s37k!UB!7gL!u=9$gWQ_gi^NQ)OVTH+^ zSM2&fo>we9+U@WDLWcCO-G&EDSJG`6t{hhod8nH+3!gf#80E-h?!4j~P_Cor6>~=$ z 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 1.2, < 2.0 [bar, baz]' +# +# The regex can seem a bit hairy, so we build it up out of smaller pieces +# which are manageable. +# + +COMMA = r'\s*,\s*' +COMMA_RE = re.compile(COMMA) + +IDENT = r'(\w|[.-])+' +EXTRA_IDENT = r'(\*|:(\*|\w+):|' + IDENT + ')' +VERSPEC = IDENT + r'\*?' + +RELOP = '([<>=!~]=)|[<>]' + +# +# The first relop is optional - if absent, will be taken as '~=' +# +BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + VERSPEC + ')(' + COMMA + '(' + + RELOP + r')\s*(' + VERSPEC + '))*') + +DIRECT_REF = '(from\s+(?P.*))' + +# +# Either the bare constraints or the bare constraints in parentheses +# +CONSTRAINTS = (r'\(\s*(?P' + BARE_CONSTRAINTS + '|' + DIRECT_REF + + r')\s*\)|(?P' + BARE_CONSTRAINTS + '\s*)') + +EXTRA_LIST = EXTRA_IDENT + '(' + COMMA + EXTRA_IDENT + ')*' +EXTRAS = r'\[\s*(?P' + EXTRA_LIST + r')?\s*\]' +REQUIREMENT = ('(?P' + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' + + CONSTRAINTS + ')?$') +REQUIREMENT_RE = re.compile(REQUIREMENT) + +# +# Used to scan through the constraints +# +RELOP_IDENT = '(?P' + RELOP + r')\s*(?P' + VERSPEC + ')' +RELOP_IDENT_RE = re.compile(RELOP_IDENT) + +def parse_requirement(s): + + def get_constraint(m): + d = m.groupdict() + return d['op'], d['vn'] + + result = None + m = REQUIREMENT_RE.match(s) + if m: + d = m.groupdict() + name = d['dn'] + cons = d['c1'] or d['c2'] + if not d['diref']: + url = None + else: + # direct reference + cons = None + url = d['diref'].strip() + if not cons: + cons = None + constr = '' + rs = d['dn'] + else: + if cons[0] not in '<>!=': + cons = '~=' + cons + iterator = RELOP_IDENT_RE.finditer(cons) + cons = [get_constraint(m) for m in iterator] + rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons])) + if not d['ex']: + extras = None + else: + extras = COMMA_RE.split(d['ex']) + result = Container(name=name, constraints=cons, extras=extras, + requirement=rs, source=s, url=url) + return result + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(base, path): + # normalizes and returns a lstripped-/-separated path + base = base.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(base) + return path[len(base):].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 macOS +# 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: + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data.encode(encoding)) + self.record_as_written(path) + + 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): + 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):] + py_compile.compile(path, dpath, diagpath, True) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.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[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + 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'] = '' + 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 + +# +# Mixin for running subprocesses and capturing their output +# + +class SubprocessMixin(object): + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/version.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..48c17c0 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,742 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 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 + +__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 + + dist_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?") + comp_re = re.compile(r'^(<=|>=|<|>|!=|={2,3}|~=)?\s*([^\s,]+)$') + num_re = re.compile(r'^\d+(\.\d+)*$') + + # 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, + } + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + m = self.dist_re.match(s) + if not m: + raise ValueError('Not valid: %r' % s) + groups = m.groups('') + self.name = groups[0].strip() + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if groups[2]: + constraints = [c.strip() for c in groups[2].split(',')] + for c in constraints: + m = self.comp_re.match(c) + if not m: + raise ValueError('Invalid %r in %r' % (c, s)) + groups = m.groups() + op = groups[0] or '~=' + s = groups[1] + 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 + if not self.num_re.match(vn): + # 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('^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..85a90a5f51a9596679a7365eadd3352443b95782 GIT binary patch literal 85504 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[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fn = 'METADATA' + else: + fn = METADATA_FILENAME + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + except KeyError: + raise ValueError('Invalid wheel, because %s is ' + 'missing' % fn) + 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. + + 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) + + 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) + 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('(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distro.py b/venv/lib/python3.6/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..9e7daad --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1081 @@ +# Copyright 2015,2016 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 Linux distribution information +is needed. See `Python issue 1322 `_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import subprocess + + +if not sys.platform.startswith('linux'): + raise ImportError('Unsupported platform: {0}'.format(sys.platform)) + +_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 +} + +#: 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 Linux 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 Linux 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 Linux distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current Linux distribution, as a + machine-readable string. + + For a number of Linux 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 + ============== ========================================= + + 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 Linux 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 Linux distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current Linux distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current Linux 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 Linux 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 Linux 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 Linux 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 Linux distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current Linux distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current Linux + 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 Linux 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 Linux 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 Linux distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current Linux 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 Linux 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 Linux 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) + + +class LinuxDistribution(object): + """ + Provides information about a Linux 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 Linux 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=''): + """ + 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. + + 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. + + 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._os_release_info = self._get_os_release_info() + self._lsb_release_info = self._get_lsb_release_info() \ + if include_lsb else {} + self._distro_release_info = self._get_distro_release_info() + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={0!r}, " \ + "distro_release_file={1!r}, " \ + "_os_release_info={2!r}, " \ + "_lsb_release_info={3!r}, " \ + "_distro_release_info={4!r})".format( + self.os_release_file, + self.distro_release_file, + self._os_release_info, + self._lsb_release_info, + self._distro_release_info) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the Linux 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 Linux 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) + + return '' + + def name(self, pretty=False): + """ + Return the name of the Linux 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') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_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 Linux 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', '') + ] + 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 Linux 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 Linux 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 Linux 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 Linux distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the Linux 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 Linux + 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 Linux 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 Linux + 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 Linux + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the Linux 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 Linux 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 Linux distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def _get_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 + + def _get_lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + cmd = 'lsb_release -a' + process = subprocess.Popen( + cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8') + code = process.returncode + if code == 0: + content = stdout.splitlines() + return self._parse_lsb_release_content(content) + elif code == 127: # Command not found + return {} + else: + if sys.version_info[:2] >= (3, 5): + raise subprocess.CalledProcessError(code, cmd, stdout, stderr) + elif sys.version_info[:2] >= (2, 7): + raise subprocess.CalledProcessError(code, cmd, stdout) + elif sys.version_info[:2] == (2, 6): + raise subprocess.CalledProcessError(code, cmd) + + @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: + line = line.decode('utf-8') if isinstance(line, bytes) else line + 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 + + def _get_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: + 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() + 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. + """ + if os.path.isfile(filepath): + 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()) + 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(): + import argparse + + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="Linux 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) + if distribution_version: + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + if distribution_codename: + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..7427eb1 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,25 @@ +""" +HTML parsing library based on the WHATWG "HTML5" +specification. The parser is designed to be compatible with existing +HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage: + +import html5lib +f = open("my_document.html") +tree = html5lib.parse(f) +""" + +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 +__version__ = "1.0b10" diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d1cc6452456b8e41c7affee1f830fe2ace8e747 GIT binary patch literal 965 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 Z!w2Q_%6u06R0q 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ஊi5na~phyz|G3B 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf78ac80d57ea6808ab2699f3ea5ec360c91e421 GIT binary patch literal 42163 zcmeHw3v?XUdEU;xuvjb}1i_~$Y6a31K?xu&%aSb7vLsS4CDRZiK@TI6p(XADTwpN^ z&JILy4cLk(%Zel0jN>Sdj}tp?(%Pw;rj47ru4Cu)!yjDOj5^j5;scRI;Zt% zeRxu`-}m2n?*pJ7iIa*vxN~>r-a9k*e)szy_c5>Q?ak*N{FS%uz1B$lSt9f=jri^O ztA7@ON+_e6STv@L#pG0SF*TJkcrIB@FJ`8)5>HjT7IRZM#M3HM?Ox1JLv5+Nt{QPmBz_fTvH4q@4cJ$$G82 zY?r4ii%T`jc5)vtX&D*twvN?Hnsa$t@?b6(&{}VUaVwIPwxbq@z7P))>vB|d{ zzuR0|w(qyCa%mB1)00-EJj3_){;@6judb4bL^&~KsKiuK8B;0s+%#yIFnO-svpO0HJ~=(m{)^pGmbrKNNvHfpth=Q zIQFXTY6p&eYNxsa$9}a-U5Vp>+O4j_ag!>lt8pAu!)gzXo7GMk7js&VyZ9ABf3sk?F9r|wa2 z!SNb(T)h>?{c1wpi{pqop?(0z1L{6?KaSU`N%a7Z*Qp29LpYAAht=C~98**32XQ>8 z9#N0tcu2inP2>1l^_VK*c)dEQW^jC+QmTyO4Qf`+;rM!WN>y;YQO&Cb9B)!pwTR=* z%2YKR-=LP%X&i4+ma5};tFqNHj)&Fb>I{x=R4eK%j<>0XdIyegQmbkW$J^CA)w^)K zLp`B>2**3slj>b>emaD20RR=p3$W9t3t132ET z&Z{5A@gDU-^}FJ;O3V)0n5s!+zMvd)QE z$u6>NowRzkc(TmGmaN)Lxn3`;Xo+>ZWS1jFm5Nq*wv5}%ut+I+v235JDgHWHE>_IP z(H+&;*jVx5haZkSUS0Z~TiS_Q#kBEcHF=Lvzbw{H&X;HGF-bQulhPd$)s;vv-oxHG zj=)Z=8neb~>ix!QV%k_uB1BI`n3_u#htDv#qX2Olq42WQciV9SHAz3Jf1H@t4eKE1MX!%fxKFU`I7@z>A1{zlV!-Qpqq zn==ni9$cy{jhYrv}nCpG8IcTi)YFx?eTK4q&ty|;3C0mmF;CqQk<=ntLOxNPdjr8aTZ#=GMU;rXf%vmZzs* zi(mBuf<#w7l{fOnZor@g1SIhcB&Pi9M)(^19l>9HKhD~THT2B2)T&_(*#_dtHT2On z_R!>f>Re(iv$B6RvzlDUTKBAG?DRr6j%oDX%sIm#INVgH_db-cvnn;;wVDQ`QsG{ut68)j7@T^a~oFls-ox)%&H zodnqGpI*(X{6gCLs_I#{jQy(Mm+?*2>y>fdsGnDT{*}K~{gEpJ-j(x4ZM)hOxi%QO zc7xg+zJ~V`oq_rSbp`4P)Dfs3P&c4nK%Id40CfTC0n`B~|0(+^_bKyLes0e>VZ`$f5qy;@r4|NJ_e+L7v9C-V+bl={l5slgWv^<+segDl3ij33qo-5Qj#$Q7cZq4 zLvZm@nlS_yFJ%}*aPd->F$5PcbuotE;-ws82rgdgW(>i_OL@i+T)fo77=nwJ3XCDR zc&V2$1Q##$F^1scrGCZ`T*RAID0?c2KjxF-B`+AaHj2@@8a)FP)t2qidU+9MOtof? zB!em&>9@#qRxbkzW+%<6wOBn)R=2K`LMu4wc{GN#iRrFkAiUZ=Yt0_N4kYEti0lMK>)$hQBKAxsmh9ONN5x@3yv{k9b~~b^VY`W zaeCf7Q#0#8!Nl_7$+C49ZK|_(AZh(E1c_|gaQ`RM>AW!r*6vFUq;g>Hf|11U?TDpy zJhjuxj%ZT)F?;}i;R$Cwswn9>TSar9!p0PfOQnuk)vbgi-Rx^c!^);N?jx$}z z^)>&#J9dEagu8NNuC8>=~{^zI~9!&MU( zjD4btT`&$`F!qcKp*qHjV>~>m`FmS=WeIjnS;Z(jOgh#WdWUrrg2ryMw1~8t)|;v7 zg7L=2mY~E?T21)<_eb3=PM(H}cD=lC3IA~0dw8?AFt~SP!N?YEqL7Fz3JYOF>rITk zfq{^v&?YUifDWw@{=5}|Q;;`;(}%tmXXsR^KD|&rTc0KwPeaJgg8TZw#dFYkz2B*7 z*>rMmDWBCEFGZt8F0pnY@OZSxB~ZSn(+m1tyu-Gw%1L;xoGfS_jvkA|>1FY|h!IoNf`~l+sYjVoFb zt$r3?*QU-*%UBqeMl5^LssXM^zAp*RNkOYhH|`d#$~Dtn|Cn|Pm}MwVP%DbVx_<69 z{Yn%8CMNE1pae|aw#UH3G8Azatc^h(9KvPq2% zCZwsV&|+EL&_HZko1L&(OLO%=5rqm-_tiq0lVXk1)*Pl%Hw-7s42?=CyCwS?+P!jM zOQJ1HvoOYRQvo$@Sx54+>6a(>4V#vt06A%rkCVO2RFkDSAr#GFTS{J+s*hGokQ3Yq zrMWPJIX(1b9I4joc$>y9{urInzeZ=_I2o<^*(T6)*?}$5a=UG-WY(+jZCKPXMT^n| zBFwUb=V-&a;BqqZM)58>z!y3aa(jIpS?b#nBr;j_szLNBDn5BPEEtX5QLx1e@IjVB z8MLa8;IIBX0)mW+iv}7Xv>e6lfoJ00;tO~NPXpiuG<09ZFCJt{b_;NV}w zGYM#=bmR!76Oa}rtT*F*tYZi+7_Pao2_{LYT2X0TkfNVC&#$BL!55J$SP z;K@KgPfoBJNPhAZ8mTS4DOMSY`cZ0~U`pWm;6k}F`V_G$^PlA|BiPytCju<+GeQ8G@kB1r0X@!5)F2%b2DI!Ga4xorAiQhM=2H^`QQGLl7Jn z5NX2M01AB*b^~DCN!*AMbf4$6zT3QShOMq~xy_Ov$Km>(1V7(jnR6jZvoDTQLe!c= z5XPo;if2XONw5b$ogQ7RAZv(i--J-&Qh15Dj39JJ6dR$Ed|X^MMi=;u!ltb;TEX?# z#xS}+`W)?R(tj+%)mKKI!4GzwHjH`7WlZ{Z;p(GX572`U_W4ntg;NiMZ0=d}dH}Ku zFn+u6BTI+ab>Zfxcj4ydQQZ{F6GC<`4rt?4dXBLMh3vXRWVhWaow4D?ZN`tdU&TEj z;w<2~4dJKYmMZ|dkqtw^8BmZl$o_LYWJUP-8^bsxHV?9ASfonC88sq%ghar5p+R(G4YNuGW94C_= z5T;I`f2+~h6~%rubEHlwgQZRjC^B59%0Qh43f;Henhg{>2h@{+I`*KZs#Rl-bVb7A zC?m%m;4gsU_pgyNi?Tk1Gu=?sU{Qd=a;n=WHhot6ih{E}lG{e^0&+he$=w^uoq!L? zvpaev&+U=4eWA3$o%%y(!zIXF)c{(16FeGMUoZ|jIaIl2!wwi9$!PcJ+u1_WOphVv zYzt}pcg!r9wKLVSnk%ad#%)@NU*r2Jp!JQ?w7^iLJvvvjN3F`-DSPxJWby($q9OOI zD431p;oB}4Z)$WXK*q-4xF20CSqqI#O?MKao*d~50O;&w(&eS2WsIv@;`I+SQPQ-t zi3Up6*_WZPZ8x#F0L0n&=#P*e%aR(&a+tvd#?)1`}mG z6WhyuD3S{f)Kvq6cD;Jg4%ZU%JwD_Myr1d=VEZSmX}r<+NV*kDtz}%(a6I6H#4}6@ z%XJaiD0a+OuFZOwJ=nOqV^XS40t4uc{t%6I2oE?p(i;HPih|BM%QuMW5dt{TO^G_I zfuIx4R&f1U;%q-68fRf^*t3*?F(8W$e?it&Q95nv9T9l>3g0i{4$@ezi7fCUqr$U0 zoi@*d*~qbE)C}z@^PK=q7NDU|pYZ6W$A&Yke5S-)4djIXU(t>^g>>Yrw0YF!SbB7W zoG`KdoEV>^e^+(8{@p>ObkD6C`keOHOoV{ak2a;7!(*)oKT!ya0@!G_Q7kf~XO~3V zG>0qB_LF5eeagOTEua!<-We9%%HUvYJKIBa>ru1jAyQMP)+c~|maR|riLwk8NVdL* zfT84Iss*F?58ArPPoP*-tj{RYz{83@5&9r>!yiCQ`#R#v2}PzS%E%*Wl|{eqny{p< z$56QRFroBtTTG7RgI?qG+hxvEELmsoT%N_uB+LL5n@&5k0!okdBq4X{L^O^%RpUIa ze~#5izm=}WES$Mpb!T}^w6nCaCtKIw!zeFYf6`@8Uuo7IV48$Nf$QYt42CE?BOQD# zT(%!a+RA<3bYNIZ=k;r%SFTMP-8JO^b!6*zii8I#8a1`3I zh=HI}>A@ap?04{j^qp14gsVgfiL?sz`k*Um$DPxIF>|Yi`D=9Xwovk|ccHwm5+TKra4!5%M`r8+^!$E^>Y2u)FYhd}78Ufl;> zm;+7sAf;Bb+?kKQE=<2fTGWT&dY3nFB;`ldhcun5@cx9HFFiGy1< zc?MfI$M+NeHPx>VrB?N;XKbujhfkpnuVWnsdTxjUuW46%vG(=r?o}52hrxmZi}hIW zX<*}~m%xJSpvOnAkDdq--h;b05#jYXgNfmoxIwpptQ&BrW5}`(Q%^kW@+~9MVAi#a zE*PUiXJIOv#PozMxRFe|4Egw|1v|R~wzw-GsH3I&DNRzMAa97N-i_k!XHE7YqOD1C zlxVcEA-9(Il>7Z1Rg?7|JmO2ND8)*8F%`uD#7Emy)OBsis72%Wl|@GKZGd0KkITjs ztV0<_KZ=~R8^!Y}c4NawqaJL*Di#-w0Y-CN+rqQv&2W9?Ahe%FF6}|}2G70GOh1=9 zn(5~BMl)MBOfX25yQ5W^_I?>QkSmJFp!Uy>2gnC8{GKpz|^_!R@kla~Vyq!p@yYk(7g z^hgrjI$3kKUk+UvVan6w#-Z-~MC)FAIp7GZbJw6=^kh#Gp~YE{TE+Mg#-3$BCX;C} zoiw!fBGEfKx1Q^gguVvrejP3hAlSMEzlPhPwxYT-U1)yC3PgrX-{LUGVO-b3gVVR@ zb5@ZY7+>|fb4N)phjK?-_%q18u@;s&h8vKSdW|qbk zp+@!KGMbtA_yC)kwv_IqTyWs3;)rSIPNb>VVe_a2Y2DmU;%2DCXmiIs(T|`*aR_%3 zDfQ$e@kp;?LcTZf&EatIU5h_Dk@-i}~9` zEeT~kT3bF@Er*m7&CjBfu$Ok~n{4f$W20?H#P@Kcv3Amm^6aNWorP{Q=eKUExbsb% z-osMye`n6_P`&9IQ@YB1J+!?QwO(Dm4>kB1)@5Kth3ar@ojQ!QykCQ_8dLu;j446K zddAcT0Ff^eA}`YMy)h8^SoT4LTL$AOAI6U`W7?Q1ue#0|cP7A)ky&}vc>}RGpF0P( zgvdLF++@l8X-;(^2jGp7??eiV)P*TlH1*@VIN|{Awh37(XwUZoCn-xC4&b>&wpG zHUMei{P;1nghd2w%x?N1QgTO)&=ekxk}y`ZI_;rlqg)f9yftR9fUKEo+SyRQ=VFDT zqcz89%ZivH#{>=&y6>7TD`JY4Rlq8jV_A8a`iB2B%$*N0-o`M+wF+1+(}9~dY;V0N zU|E8ez!2LwZaxIqY$I;2BY?yJqan5d>|DPgu8APKHGblnzR0SZ{T7M1ZIw)N!L=+T zk*69&rw3sf09qsKssYaEx7TxVsJfOR_FC3wBG*c`jl-1?ihE zgFb>(-7-V+t1efXI77b5nP0$}O(^N-ai#|g2n#B{=Ro`NpG4kXFzUA=dHcL|?Ktb^ zRsBuRMn3Ib$YGBF4C;sOJP^v=Cr`*}S#6&|*3J!1OzM&LF*K8&en~a{f^p3SW7s;* zld{@|%28vFzbw&P$wkf1UzRGf%Of;E8Q)@xrsw%??D41SMho#L1VfF)l;Y?37(cfef>9D8`k4o*N5 z=N)k1f)hTuqXj+I#QEC=1DuC2gg?F0f?l}Fb=K$=+Y;^^+~ivFe8T)5%Hp!FD)$F5 z{|cpW&y9DY6l#bm^AB*H!zHv!XiKEb-@qCA#=n9y`T3rf{ebu9t{-xL)f?Q=dIIC&Uv6(E(eK> z!Kq9#cZ})SS}BXlL51{iA0ng&ZvR6-6-bZWC_o*uKchSWx2GKQTf~1|pET%SO5;yRV?06{=rCMu(kvQxqbqVb8#|Jy zfS?h0*8M3>SrLRF2%&@}q{^{la>ldD_yUx|F=PHN&e3Gxa2x$m8S__hhQ#s(oGHwA z+r8Y>0Slb-zT?9!4cqp_OQQh-QF}gN{cR+7e{=2@&q9IOCjyfM8Qgmyl)GP^kpi>r zJNW`rq>$Je(lJGJQfj{B?zpd6zzVE`4yL=_RleLTV;2bY&hR1{%FKA@8yN_?S4dp` zBp+JzIif!%Jq64!N=SYLg?)^@;1)yzA<14qOs!U_$$b&8CO;!y*!Jo-5C;jxieD6rlv9|Z>0=xm5pD&rUe5iHN7ZsT)ir#YK(a|c7SXsNb(RG1MfTL& z5Q+9w?uDc!m$7t%0wP8#7_u=i{7;F4Oq2V_L|c#t!!n{u6X+8o1m zT}DW-;~WIE-KVx<>)+&^*m%+>rA;8EZSK}SB8!Ed1OhQ(CPMnqGPb~WH%avOm+2%w zTk}}EWw}1T72EKeS<{HEPhzWswvXz|T`iY$diSf&ug5Od>@Nz|(h1;ai2wDe&^pY* zI`HAgalI=IKD-VQ&4+sMFmMfdoah}XKZlG)Y)M3v8zZVgqzm9)x(l!e3mjUn`KHG) zy5@Vyh5zlyMcp!Oz8z5P0u*hW$-zX!7!BYW-Ux`soVUDH!}35RZPuT>MPLSLr5h^l zD~;&{(p+LN3G()akcW?ojK)nKk$+*dH4cPw1XyjEuXzQy6|}rG`YP(J<%(|^dDwxg zo!XnVUSxX@BNE8Ju!Rr(36l(0yFvJ&*k&u&pBaPRtB8 zWEu_0Nd~P|BbqK=L(0sNj*F6lv@*9uC4+{Xv>wA#X=P_ms9l1V#20KTYFTt~*r}0* z90_HJH)JeZNUhO37fR!amK*D~e!FRT#^&zSf^7dA*n-r2ycQH420ociZP#uufYxny z6ou=yqx#By3(;n1HEf(u_oCh$2;LNQN_XQQNiA{-F&UQd<~2$OQYg@4Rj13{?Ic{g z{vwJwq;$I6y+-3CCmwX7TxzRRMKzFUoE61NPhcZIt`Hu;Zq$HvY@3Rv4Osj-LH@v* z{Y*$|V+(3-4oasf6@9D|r|Pc_0!nLK(Bw^HOJ}%o)i&8$ zh*On3F1WIewAPtZ&oxV<^Ws>KHZ0xYr_}9pi{&*p4yj z7-t>hZH}?z7$+Q~>=<{AJ6%U>Gu(hbymgV2Tf)@X%FNx$$<@!|%NmP_buP}(|Az8VLJc9Lad7U@X zv0wI*hh5wui=C{4U61_Dirg7z(i@$E`^ws9u$4*E_;3%lO|D@B&%3JfWi5OG$Haa} z@{KQNK$T}p%T=2mVSQ$k?7(q9>K9uz>4JnXg(gS%bnMs|X1j{vEO! zr;&rBUQb1GbbH-QpGAmCo9=$}^dFpX{S2RrR^>X+3WOxyhvn7nr*aEVc^d+A4KCBcI_ym)WY`fe^ zx_kktpCqF8BjSl+?L^?f2^A>J;tXO*j=RR?PH?kU6F2=i9Dj^Epi0}pv`O$6DWQY*MIVI zKq2H2+l(X(3Lm=>-sr+@gf}QdIsk(#aCyAJCgvv6QQp9gzrLpt{KE!yc|(t=hnm>+ zH|Dvus@K$!g@-SS1)6(%Qp(-QlS?MQGgmEhKN>cx;l5&4c|CQvL@vUJ;RK z#@mqlyN!dM=h5WyZ$N(9P)&2;HiY9373KIUt}w=h%r?&~rS9 zW+%j6cj8^N_DhoLL{01^zfW}Eh=@japm_xN_HZ83PTVa)p_jzA77j>M9-%efzk$1< zJ)>GlJG^siTVE8Zlps5;l~t6X7sQh1I4J#$i>O@Fpfr}9NKSWaMx@hNC(jYN9@cfv z@Gx~NB9Ub;8DPBl&lUjs1v(u@T@Ri0K_$fQGgV=z}tX2$ZkYk@q5kI`t7DqZ%9( z6?dxeO9rj<2+rs=w2|EiIgNWBJSKiYT<0&B3n`cMHbg-_?E3CASzFibUOZ7~hgH`+ zjqWRqWb_09v)38t{v_-UG^uc>A=#5(6Xf)W)=quqEEQwc=KVwAPTw7fP;4wwr7W&dK)v z)~br?A3QkPd&_xO7>m+IBztkr^1;t3#q2Y-XxJyiT z;^0r0c?w9wRCMcmk(`hgA#A2xY_@*xR?jo2pPqO093Y{3Iw&`vgHD^uG1WQNb>x*otPR z75lWJOCIaP1aedsydfkKoBy3(UyQUWEnz;7`&|v!{Fm_c$K=Xhbq$=~yWso|2|97e ze;D5;rbGV2;*ftH*E#sqMRUo#2W9M+S#U#A%6>J5Qi{!`V9My%bvfq~r@!tx&WBKz z0GMUTeOtW=zUnKRpBMG!=aF}(+g+Yy=Y5hk&=2sCQ{+}5CT^;|=jQ^gF|32ei)A6H>)6))T z{~s|JhAy=Q(f*v>;U0cM#whU3!!tEYuSJVqzh6c!BG>gd2V8~_CExR? z@8dmwoxyJ~;5e}k_AvGp1ox5zCK1ung${AO`#Z-Uwd1n@$GCQ?Q_5(kI^E`+VNPj8 z>Ek=nv&_XE8c=@P{sJkVBsz#1 zjSf%CATGlChRiOAEu#y!bu*@0H~RN*qozh5GQZ&pi9cYvg>{pRXc(Lw_2o$Z9&e)Zy7~7<^5L@sEi@B~ zf{f~ghTG>(;v7RISii(TFcoOMJ3LR%OZ@6tINd6_RKSxO3fJmSYYxOs#1jhiXuQpouS_74Q zkH+aPIn!Kn0^211~)q_z|x?V2jZ{ znq8b#{FO+4-`%%veyY8(alZ&C6<&BF8m|D?Q+xGTPJ7t4hH7N(wsUnek8FhN0)b0l zb;8sOxc*DT)B!}IH0OEOqNWx-E6{^u3%fVkS6;=Fu-e}jo~*w{Bex%h@TsU1V*Uz6 z{Prt`m?pYxjhOg%%VPS`w_TBW82wu7GTta3`66w8*<~nGU&l9hBKnh}_JhyH3g2jl z-A7!8`uGNNXnpAvIH>?m`bH#2YffwRj1-^L)8fw-=0e&+>4<~qC)mK3ql3v*BkMEF zMrg(*r>ByIz9c4Qx-)vRY@fk5m5*wtj+T;lVE+hrYLTaq=>?o|%moBR-OQJ@@yt!K zwr$EL+-NIfJ(0@(@Mi?`jfe#F7dQdJVl}SyxkB||Y-I&MJsqi)7-P3abbQ{7>%#n1 z7s(u&YGKoxA9s;_LeYxH`f0%|QQjr)ODcfX$Td1Dwfl%eYM<8S##haWa+mSkN6nrI zljx-9L9e!pDurG?DtBGY=oAgl2b>0L2fN)BlO0To78+cj`v*u9qu{@znXUi9KvXWV z4Auk5w+Rh6bLxEZK=0BZ(I5!Jgc4G_C^7zUYZM%p)oEG-y*>#O85g>SeLo;!oJ5b-jwG%d^_3+`NoMZfk*njra~&O*OR6{qX1h9P>EX7rhf& zX9trc-q}SfiZmAoB4pTd3XyPgiJR{L&a|3=bR8Or3m7@GGd%dvDlOI$p~_Rb%Kf!c zH{*68=V+^{q7T0lFR~Utz*-taMAwpN>8KYRQ}H?LvR2A9)uQzPlQ7sL`fu@LF0p2; zJb_g_tP!ps!{CYxj|6A1ve_LlF}M~`zPm}^{OuS>&Ei{`aEaEB+nFc1)~X+)`~xcS zZrSt`X;yG<6V4^nAkX2~=EDie$MR*(^y%zF=)oA6!Chnx8ypmfrB+jLou;j?t?aXN ztMK4sFm~q}hmyPJ6BroQ-QtRiH#O;UpFPrQUU9g zZ%hy2qv((7{?UcHc!3CMBp-cL`wqmJg%R!zc}RU)oInP>nZgSfFI~E%m-YNFmU1rw zj3&N;@huGI7zjGpU!1->>h-e4B{g?h7M3sF%9ELy+Olao84Gg_%Nj)@Q-79uMOkBq z!}#S@Jh6`fOT_w}6)H~n{|5H;=FC^S_b0`9$^ryq?VU0^V|Z13WG%kH3mxzW*Mw7ILlz3!8;kei$Rsa zlMK!=Fd00>;AsZ$X7CJyXBoVg!4EU|5eDyL@Bs$zXYiv8KFHuh47gXQ_2UelEKFq{0xJSGx!99RR#?PXBd2e!EZ8np23$G{1$`XX7EJ@UuN(-48FqPFBtqK z1A4lxzhdy$3~1C_-(v6`2GppuUqFN{iNs>#JH6A>Gu2YPK2xq%QTIMRMhxp}CX%7# zA;bvPI$tx_14#7e26D&pCvutGQ0_{E{2Rpo{@kA2_T1K75B~3R!#;`Ub9tm4!nJ<+ zJ&@ay+m_pb_&{!V?#5g(H=Nsy|2vR|<&5I$HpDjPuEKFsZYQq1PVTlHci4^JyffpQ zbA1+{aAM>N!fSTfUbX-)D~WSfia{EI)4x<%8k>F`V{0{QtX^5MNP^ZId8ucnR;}t~ zY;`NkGu<;avu>A6yRK*LbTe(9K@WohgI)&gvRcFqFt!N+a9uH%mhC#$)0Gx2an5dcxlzt_UQ+4$ z4WF~YVm@M~U2V@cYEM`icudZ9s!DK1|Gak|y$g-nQrB)-PWG2vnu9doDK(Y`m*rWpaLgOa@|;|j{;{LKg=Xy#Km#p!QI4693-xVuj2H*2yRjlEAK{$_Cef>3o zRCnz{w5zkEZ)6yEdzmuU7x6)?<1Dp{{WNZ7LWW6fq>2)~Q|Gq&c_#Xad_3q$NHazr zn$SS7b3(SFequstl$3Vyb7}T7aWB@r$Tat*vJ0_()K@Coi;R32#mcVfY4LG(7i;yh zI5l>;n=kSpYMM+9#vdBrBNug;WT^}%v$gdeKD~D9wSyhKMwr>_3aX*M@vMLEqpMdp zhBN(>=7YygbWMIPTA!fkAE1(~!3AqLf;Ze2YjNQS_az52JW&E}h$?WaC?7+k9+tTm zH%;&&Hv7S~K=))bj*_6KvYu2Xmil(J8sPVvG>FsK#E}7_mxGQR=)mkpCWw>_l2{vk zIndJRAX9XAw$#OegARD8*u%NRbYBr_Tak>{o=^y|eLDqt086Z|& zjYV@IQ}JG$MoDgimb;R~9Sq%VOE|Bj>8q3+l0lcEMCJ~nq%RBSyCS#~ydB5)|M31s zE6X-62OGPQ+Nj^gXSi`xFWeNr&pW>e?%bjN;YMNU(_qYw!hG;zKW^>^%_t3aCG8(B zsI0%YpSyB0G%`lTyP)P~Zo5hGrC%9^B77G`{}I(5J8}+pM*JT8;=wcL$UX858@YxX z$GFC8dB=|W`QfFJi~gmf(#UC-Mx~M0a*jD?&o4b;&#Sr4o#?7hm?^g_BQ|o59nOqD zV#gdcW^^2F%*>Zy%7}$k!N3W=Q=hd}oS9UcC~ZpX5z@Al$J5TVR5p|;Hfdd|%2BT; zQ(-*;{#ZW@i63ET-9)B#{!^`qKUsPoCq>!H7>jz@dRiteTgt<0Yaz|Pp8_BW`lnG> z+EN}l>(Pk6GPMC<{+n*~RD6H~w{;MytyY!@sr1%|x3)gIasALdKRmo~E4kU*`|#jq z^X89Jb-jBPzrA$p@m4SHUD@r&iMV1~w~}^is7RHU@Bsd2YHQzglbcDryA}3LoaoKo zK&@fX8x$7GyUg?WJYV8fzU(aV8eita^|#ryd9wdWbScUnN*-OLb7okZBN8ZW=h!Xq zcGW6+thTL1O)XC$P~=0NG=7AJChq#Po>NH)OBF$8ss}FHialxzgbP%imG+u&HR3nEeCQ|NaSa zAs7Ee;=gnF)}gR&rUbIOCnAHRP18=dFaz;3lza;e;SBg>3xwz-W|tudPMbJ!e2ocj znXTp<6JuxBARqA&xmekW356*a$=Iojb*?^uO~jZ?TfeyVq z2LvUs%8q5j+3-Cbwu&29)4r!#p2tym!}@~4ZFXFc3ly6)J@*g-p6 zoX5KnJuN0AwR44f{9p(m)^!C>_OkYB1@m-HMZ17oYIA%;ZR+??QO30^huvf| zf0%AI?m-%zJAn>`<>C>}krv=;uQIgOFftMS-pK-Cb zGBroWJc)E=o$#zx ho=|(qEpw0i?s?xqaH{BA;$?h2ck!ZM_GkPH{|A~5J?sDg literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b079230f42f638b05ae0bc8e421deb06b2d6e8ca GIT binary patch literal 66322 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

>Sy+dH@GJ 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 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/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..7c5639f --- /dev/null +++ b/venv/lib/python3.6/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\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 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"") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have ") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, 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/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/venv/lib/python3.6/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 sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": ""))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61712b816664045ffa956cb3c6d0ee277c534ec5 GIT binary patch literal 428 zcmYk1%}&EG49A_cD`n$jhrIyD9U!1>i~~X-fdm(XU;@@l)RAli(huCU+IS-#f*0wP z(_VoSNl!TPFV5eVV-L2s+u`H)bdLc1z(4EQ_}qGNZy`Vs4GD=zLL-`Zkw-vK;b}i< zMF9aBM6Fe~Q8ug+5_p2N=Y!mQZ{sxqcczdA&mhC7CHx2Ix7M~V^u2mFo)wucjpQoH zGcueula zO|B+Z@-!=QZL2_})6}H-xcX!=PLo_nu2L&?tW1Yiji2J8NXNqjx8FSo2Osksf+P_Y zBw~U_p4fOp2Go^rM!u+t`VEO{q9Fo!*F{r=@NT>zK8XSV)vEk+oyz%xZ~DgSII-=1 zY-Br8u`%sIuG<#AnqIDJ-$HBnviT3-X%11sN^_{m^U#3 zSE;?|u!`+Jspt%r>xGtsbfz0{!h6##bUKZ#>`r6d9pp+#ZMsj7yI&n1%kh;c}k9};757=oz}Tt z<4e>3v)xiT>@oJ1C$_Lb83+xi&+gN0y3OW0j_Z2n8p{v1d|SuQ3D=Pk~! zCb7Ex(%@X=3Fpi1*oA`~K>a1ms?FPWO{7wgf>+Z8V6lyJ*Sy&GI7|ou7267fMi9FD z(Caj?_F!Ts8ft62QW}-g$f4Rua;0Qq;m2uo4VUqt|LUxW5u7XuoTAZAfnC<}{spWu BUoQXv literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f04ef9d24b7b2451ad3df252ff0c8ed6fab98e9 GIT binary patch literal 2030 zcmb7FTTdf56t?G<$q*n5>=Wt*VtOUWyhq+R7SY2PQk0U^{6* z!^?(W(SOh%(LdtXKJ8!VQ_t}PHXyVuj(qGK+voev#h%Ui`6zt;*ROwgg#1lr8vG}Z zp{t)kaKdRyGTNb;({VDl<5JW)sh9bkz|P&YmW7=V<{s$lppPi|iEy6>=Y$6$nz$XG z*M1?b@HJQ@E!Ql@2dYSiTCgM=6jGazC!<6qMQ)nIJn0r(ur$#^#;Iyi0$q(jXfh#Z&iK2M_UVK? zCBJQ)x!NgR?M@u^x%N1n&{uSPuXJH;;mj+YzF&G1O3Cq8`{cN}PjtYYeywySu(KpA z9De||>eklM3+K!|^Gm-Z{jhW&k>eNpkP4vX?w+phr0M!gaiZ39LoHa_GcQ?0;w zN~AsGRm$#BER}J=uJLeg{85|^#h*m3g5`g7dmxihtVMei%XY6wxsa;;V7vY8!_Bci z9*-Yxr(1)=2cxa-);GD_%)W+pn78-ZgJf|3V3?%*zV2E&C8tT3=;=JVxN))bGNG7Q>^7lz zzJw(7$;$wOOm|yUHbK{NBwCesQJ|xhSc92qFxD+{9Ycs2y9XL&YlWWPnF799?P3LE z!|@8JCIAZguRtB+rXsJ9X@z_Zw8j|hUO$l zN36oTsHl$s<2p9tel~->X0dOwa%(ONX^|farT+(uPk_M}Gc1-Zi>v2vjlX>LJeE`T zworTu1iqXhv3diE$_U)m20jFNoC(HE#8_7FVTyCOp~u5GtybhaU{1b^;(ZiYT5=r) zR)xgaOLSc#^h{>#Rlw_JzXx@g*oP*hVIy>_Ut~wSzT28Z3caBoN}wR|vP%~QemvkK zWZy2kRW5+WEW%^AF@5MZ6x5@AsC{-2D`9FoKRiLlZ=z$uN0p=B<1JSqh!v+n8&1Rh E7h+JlKL7v# literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1242b16dd304ceef2fca01ebabe1ab45383b40e0 GIT binary patch literal 2235 zcma)7Pj4JG6t_Kpc6PE!wxy(rfD%A}7SY{SX&Mey)lw)DLVF=9Vg<4$Yi}~i%89dA6UQ{rrCKk9SsA z$cf?Rd?aDAa*%4-H$0OA^Mc}e)cX4>m3=&X(L5MDf?q!cB1w-5(qn=O_MG%Q;Rzpl zxULAH4@6Bw(1)TfV(4q4DH>w+IqgMaO{@c_E>__B*Hi?D^%)Rs*rS>!@ayk^7{Ce@ zl=PU+$v0$9=TzS^On7tpJ1uERxM%!ob&j(@_&`Gum|6+40|v855Kt9%`)C?ARD&+j z_-_I!$*;{BHK4}OIeSJZIc07W?Y5YW0med`r07c(fHbgJ`;MiPKZ$C<{N<=KQt4S@ zWalhVoxv~@Qt8g!z0Oznb|&U@GP$>x?T!xbp6&K`?-yz(zXR>C=FD;sIL*Xu zGuX?H2UCSC_wzGZh@t8nnLOLg(t{2+;E~SgygfR9S$}XS3pp97hbw49WzcjReb(kY zEmFgI`$0DBgSQ{Hm%`J{$62<0BG2`9KGtUYKyGU|wK&w4DChXP^^z>JKFZkoKE%hj zN)43_xJXQ5Lk*!N1xzae-cR~R63(z*CJWoB=A&U+7!5G_T4n?5<5q`MMONX;HdthPPO&8({BAg=x3*(k(x|O$}30RhN3)AH)n(BQt68-d=6IVDtlm_(Woa6dJ zU-QDaSN}`Myz$v}+N2E_$81`6KEO0xVvo2lu@^8|WRF@C70!q`12pbK?_J;w1@$;s;5_q- z1{7S!nX{RHfo$NA-4_hJg=;?G3gy|Qh}YeJ3g%+6sZWqx!32SGz_fxYdp2z%ow(XIq>M44A0-UmT_9S8wTe22_+)?jNeo^Clb-n0uNJ;riWB)R0=#+>Iv zG0t!d)#7xVWYvm#4=?fo5`= 7 + +# 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/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..9e7541d --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2945 @@ +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"], "annotaion-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"]), + "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"]), +} + +# 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): + pass + + +class ReparseException(Exception): + pass diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50a4a991e77bf087986a42eb73294cb62071db7c GIT binary patch literal 203 zcmXr!<>lfC+Z)LM1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnuL}KwqRg_yl2rY& z#3KE){G623qGEkRbA1aF&`m1M z%t_HLNi)yMN~0Tuh3IxHl;;Xz4Cb0V}CQ>jAvtEp&1>2Kg}5-KgfeI5Be*Z<{X3|f+~{J zgyt+^xtDm92qrw`=Rp!sGHJsJUxj%iX;5-PiYGpi(M40grv$&+IybYPl7f9CZ-@v) zcuPbmgF*AgOPZo_NIKCScq1LpE%L4@)zHc`%d1jb7l~|?nXD{adst+>Qpi+gR%))y z9mPA;`CV=#tgUxiNG-))*0VjtyC1-D#%UQ8NfIhZ!UPrUmL#6=z`yUp*O>y?9%AAM zeoq9db208(GN1!CB{y`BeEx7vr&Q1tBBF~>C)T?m*KGXE`mpP-kU?;B&$RKC!TI(l zcI{pJQ-8{)-VV9kJt3gM*&Q;a$B?VbM<Q)47-vO%6jxcb+8t&}tlIvz8uYI;Zq+j#$wHJmKDW8r zQdu|d*U2<7SJgT1N}Kh#;@0Y{3#Bz{)x<|?=>Dp1;BRQ)1xeuoz{^c1aK4eM?*dz1$if8} zka2#&bLoN+S3~(XPkIqSmq1`cm^KJPm*_kV=_9%fYecUW|B3eio)JWVcxmdIX_}W} zs8F9z)5{@OGfR#7z*AkD+8uI0P6lfl(VEjir-e}cp&e>~(rD5i3Lk_cHG9|Ul}gE; vg+4Je?ya|V|LkjB>ZDc9IzvEb)TsY+4<(reyo)c#An#>1&lqh3+K?K#Lq$w?f zG$>ihDEUZ4AlMxdOols_4n+8g#Dm{}CNb+K*}~Skb&{*Hsg3I*q1MW(y6T>`mC9=& zxmHe^Oxqmq>@9%B6}Wu~L6VdTk_Li`;EtqBFcCry#Xt-p55x#Kqi*;?X(*NBT{O(- z@4@XD!j^6c2Ni&(*D>vewr))>3MXiN2HaVXs zmlxBGyV-0m=6cpF&)2hj_NFq^@-^79NayXAf#0j<4e(c8XOv@5Y>$wP-c2k2$|-Gu@vUd}D)snF$8ebP!Om!MWl; zZSk!m8nKA^J*0rbMeAAvg$<6?pjLzEZdfl?GIt(&P|`E>gM8cf^bX&|5Ar$t3kZ|I AbpQYW literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48f95f1f0493b25dccb2aa7d2baa50a7e4a6776f GIT binary patch literal 1704 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 UGHm>7r&PoFFY2DOhyVZp literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6d84d4a0512d720c4cf22e1408e7fd90d146456 GIT binary patch literal 18042 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 Kp2dfx*na_1rT6>* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7b766b8719652c7e824783cbb071bae4a21c22e GIT binary patch literal 1279 zcmZ8g&2Jk;6rY*>@b1QrqbQ^V5JE_muu!{HX-E!L1q9PuRN<(UMb&D(Gfvi-{m9JN zxR!HDPy7KraOT1v!9OxrPWcyl;=MI(qmK2)`@ZJA-}~6_^`hX}Kfh|1kblXo13dW- zNLO%i!l@)BO=!syRyv78QO2a3xZL5c^h!VRLFRE^cFG_L$}kCm?@S{RUehEL?sS6( zBHSgwb)OI(^5_-ek?^OzYbWXP4c>i4l1dc2ng%GucpzQdCCUzHYKy9G_<@%fU}u zvh;qtt6zMbW5~DX9r&+6B1l3xNtkdr9;EGC|EEI2tJZ0h zuz?W^lPQtqm>3>>771hNzu@BZiZ1>%WJ;%O1rPp6Ui@*zR*bVfa^4qWbh9`H}ne|y)XH|Q$9GU4fG7s6#JK^_M^5lPnFO@&BgnM<+YSqqea^4^}w~R7IKmV zP~+CrdZxY*mD+^&{wC^E_FV!w2umz+)fs0U=ZqopM+caWbpj{TRO}fRF{q?Zie_Mf*L4f7JszN!UG%agB zlla|D)5}>V|JQ^QRWC)Qg|V(Iv{3$;`|Ypi-z&7*%0XmMNhkS{Ie=optgroup + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..026748d --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,865 @@ +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 / + (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """ sanitization 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): + 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> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search('^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall("([-\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("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..8921052 --- /dev/null +++ b/venv/lib/python3.6/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): + + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..f7043cb --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2733 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys, PY3 + +import types + +try: + from collections import OrderedDict +except ImportError: + from pip._vendor.ordereddict 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 a string or file-like object into a tree""" + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + 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): + """ + strict - raise an exception when a parse error is encountered + + tree - a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + """ + + # 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): + """The 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 + + stream - a filelike 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) + + scripting - treat noscript elements as if javascript was turned on + """ + 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 + + container - name of the element we're setting the innerHTML property + if set to None, default to 'div' + + stream - a filelike 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) + + scripting - treat noscript elements as if javascript was turned on + """ + 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 + contentType - RCDATA or RAWTEXT + """ + 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
, , and 

lfJ~_wIH&oi@IsO?IR-+4Skp2*?kL|l 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 ZeqrQ6YQubz|LtvcZL5yl8Eq)${|EDF14#e? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/venv/lib/python3.6/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/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..ec28480 --- /dev/null +++ b/venv/lib/python3.6/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("([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 macOS 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('-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('-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('-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('-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall('-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack(" self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..2b198dd --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1111 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2016 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: + 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: + 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 + _fsencoding = sys.getfilesystemencoding() + 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("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 imp import cache_from_source +except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/database.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..c314426 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1312 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2016 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 +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] + 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 not version is 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(): + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.finder = finder = resources.finder_for_path(path) + if finder is None: + import pdb; pdb.set_trace () + 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) + + try: + r = finder.find('REQUESTED') + except AttributeError: + import pdb; pdb.set_trace () + self.requested = r is not None + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + if path.endswith('.egg'): + if os.path.isdir(path): + meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(path, 'EGG-INFO', 'requires.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') + 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') + 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) + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/index.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..6803dd2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,515 @@ +# -*- 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 + self.rpc_proxy = 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} + if self.rpc_proxy is None: + self.rpc_proxy = ServerProxy(self.url, timeout=3.0) + return self.rpc_proxy.search(terms, operator or 'and') diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..14789ef --- /dev/null +++ b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1283 @@ +# -*- 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 +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('^(\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) + return client.list_packages() + +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: + 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: + 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') + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme != 'https', 'pypi.python.org' in t.netloc, + 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='): + 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] == '/': + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if is_compatible(wheel, self.wheel_tags): + 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 path.endswith(self.downloadable_extensions): + 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: + 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: + 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: + 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: + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*))\s+)? +href\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*)) +(\s+rel\s*=\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + + 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._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: + 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 Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/venv/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py b/venv/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..9f03364 --- /dev/null +++ b/venv/lib/python3.6/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 ...' % 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