From 075aa6be42df5f8a799db72f9c7b70091ccbd03d Mon Sep 17 00:00:00 2001 From: Corder Guy Date: Fri, 6 Apr 2018 00:38:55 -0500 Subject: [PATCH] Add virtualenv --- bin/activate | 76 + bin/activate.csh | 37 + bin/activate.fish | 75 + bin/easy_install | 11 + bin/easy_install-3.6 | 11 + bin/pip | 11 + bin/pip3 | 11 + bin/pip3.6 | 11 + bin/python | 1 + bin/python3 | 1 + .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 275 bytes lib/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 + lib/python3.6/site-packages/pip/__init__.py | 331 + lib/python3.6/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 8375 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 374 bytes .../__pycache__/basecommand.cpython-36.pyc | Bin 0 -> 7210 bytes .../pip/__pycache__/baseparser.cpython-36.pyc | Bin 0 -> 9271 bytes .../pip/__pycache__/cmdoptions.cpython-36.pyc | Bin 0 -> 12929 bytes .../pip/__pycache__/download.cpython-36.pyc | Bin 0 -> 20310 bytes .../pip/__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10483 bytes .../pip/__pycache__/index.cpython-36.pyc | Bin 0 -> 30233 bytes .../pip/__pycache__/locations.cpython-36.pyc | Bin 0 -> 3869 bytes .../pip/__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7464 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 338 bytes .../pip/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 21655 bytes .../site-packages/pip/_vendor/__init__.py | 107 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2741 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 18560 bytes .../_vendor/__pycache__/distro.cpython-36.pyc | Bin 0 -> 32532 bytes .../__pycache__/ipaddress.cpython-36.pyc | Bin 0 -> 66367 bytes .../__pycache__/ordereddict.cpython-36.pyc | Bin 0 -> 3565 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201056 bytes .../__pycache__/re-vendor.cpython-36.pyc | Bin 0 -> 1053 bytes .../__pycache__/retrying.cpython-36.pyc | Bin 0 -> 8042 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24431 bytes .../site-packages/pip/_vendor/appdirs.py | 552 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 500 bytes .../__pycache__/_cmd.cpython-36.pyc | Bin 0 -> 1509 bytes .../__pycache__/adapter.cpython-36.pyc | Bin 0 -> 2836 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 1711 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 567 bytes .../__pycache__/controller.cpython-36.pyc | Bin 0 -> 7711 bytes .../__pycache__/filewrapper.cpython-36.pyc | Bin 0 -> 2104 bytes .../__pycache__/heuristics.cpython-36.pyc | Bin 0 -> 4646 bytes .../__pycache__/serialize.cpython-36.pyc | Bin 0 -> 4423 bytes .../__pycache__/wrapper.cpython-36.pyc | Bin 0 -> 519 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 -> 557 bytes .../__pycache__/file_cache.cpython-36.pyc | Bin 0 -> 2754 bytes .../__pycache__/redis_cache.cpython-36.pyc | Bin 0 -> 1660 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 -> 394 bytes .../colorama/__pycache__/ansi.cpython-36.pyc | Bin 0 -> 3292 bytes .../__pycache__/ansitowin32.cpython-36.pyc | Bin 0 -> 7024 bytes .../__pycache__/initialise.cpython-36.pyc | Bin 0 -> 1615 bytes .../colorama/__pycache__/win32.cpython-36.pyc | Bin 0 -> 3585 bytes .../__pycache__/winterm.cpython-36.pyc | Bin 0 -> 4517 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 -> 992 bytes .../distlib/__pycache__/compat.cpython-36.pyc | Bin 0 -> 31953 bytes .../__pycache__/database.cpython-36.pyc | Bin 0 -> 42091 bytes .../distlib/__pycache__/index.cpython-36.pyc | Bin 0 -> 17325 bytes .../__pycache__/locators.cpython-36.pyc | Bin 0 -> 38549 bytes .../__pycache__/manifest.cpython-36.pyc | Bin 0 -> 10311 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 5987 bytes .../__pycache__/metadata.cpython-36.pyc | Bin 0 -> 27030 bytes .../__pycache__/resources.cpython-36.pyc | Bin 0 -> 10859 bytes .../__pycache__/scripts.cpython-36.pyc | Bin 0 -> 10026 bytes .../distlib/__pycache__/util.cpython-36.pyc | Bin 0 -> 44453 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 20969 bytes .../distlib/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 24990 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 434 bytes .../_backport/__pycache__/misc.cpython-36.pyc | Bin 0 -> 1040 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 21387 bytes .../__pycache__/sysconfig.cpython-36.pyc | Bin 0 -> 15988 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 62998 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 -> 913 bytes .../__pycache__/_ihatexml.cpython-36.pyc | Bin 0 -> 13807 bytes .../__pycache__/_inputstream.cpython-36.pyc | Bin 0 -> 22661 bytes .../__pycache__/_tokenizer.cpython-36.pyc | Bin 0 -> 42111 bytes .../__pycache__/_utils.cpython-36.pyc | Bin 0 -> 3320 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 66270 bytes .../__pycache__/html5parser.cpython-36.pyc | Bin 0 -> 97955 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 9316 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 -> 376 bytes .../_trie/__pycache__/_base.cpython-36.pyc | Bin 0 -> 1465 bytes .../_trie/__pycache__/datrie.cpython-36.pyc | Bin 0 -> 1978 bytes .../_trie/__pycache__/py.cpython-36.pyc | Bin 0 -> 2183 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 -> 151 bytes .../alphabeticalattributes.cpython-36.pyc | Bin 0 -> 1022 bytes .../filters/__pycache__/base.cpython-36.pyc | Bin 0 -> 801 bytes .../inject_meta_charset.cpython-36.pyc | Bin 0 -> 1652 bytes .../filters/__pycache__/lint.cpython-36.pyc | Bin 0 -> 2323 bytes .../__pycache__/optionaltags.cpython-36.pyc | Bin 0 -> 2995 bytes .../__pycache__/sanitizer.cpython-36.pyc | Bin 0 -> 17990 bytes .../__pycache__/whitespace.cpython-36.pyc | Bin 0 -> 1227 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 -> 406 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1483 bytes .../__pycache__/sax.cpython-36.pyc | Bin 0 -> 1337 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 -> 3085 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 11128 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 9224 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 11818 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 11770 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 -> 3776 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 4532 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 1673 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 3627 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 6608 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1847 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 -> 9860 bytes .../__pycache__/linklockfile.cpython-36.pyc | Bin 0 -> 2239 bytes .../__pycache__/mkdirlockfile.cpython-36.pyc | Bin 0 -> 2601 bytes .../__pycache__/pidlockfile.cpython-36.pyc | Bin 0 -> 4801 bytes .../__pycache__/sqlitelockfile.cpython-36.pyc | Bin 0 -> 3700 bytes .../symlinklockfile.cpython-36.pyc | Bin 0 -> 2124 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 -> 670 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 508 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 955 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2812 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8826 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3813 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19774 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 439 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10549 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 -> 95258 bytes .../pip/_vendor/progress/__init__.py | 123 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3796 bytes .../progress/__pycache__/bar.cpython-36.pyc | Bin 0 -> 2415 bytes .../__pycache__/counter.cpython-36.pyc | Bin 0 -> 1539 bytes .../__pycache__/helpers.cpython-36.pyc | Bin 0 -> 2925 bytes .../__pycache__/spinner.cpython-36.pyc | Bin 0 -> 1181 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 -> 2288 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 15758 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 5989 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 7103 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 775 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1361 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18427 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 4831 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 948 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 21862 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 17920 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 3609 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4356 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 18744 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 -> 1554 bytes .../requests/packages/chardet/__init__.py | 32 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 647 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 141741 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 909 bytes .../__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 2521 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6131 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 1975 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 1726 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 1446 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 455 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 310 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 916 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 1896 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 6866 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2207 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 88781 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 917 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 61179 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 917 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 68797 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 923 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2711 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 84013 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38518 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24800 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30330 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24487 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23345 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24785 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23331 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2743 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 1934 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1020 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 16563 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2693 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1584 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2240 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 3220 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1739 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 -> 2477 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10560 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 8419 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 22703 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 8876 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5834 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2637 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 10823 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5579 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 13756 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 -> 168 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 6636 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3265 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 10109 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 4483 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 -> 294 bytes .../__pycache__/ordered_dict.cpython-36.pyc | Bin 0 -> 8371 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 24466 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 -> 455 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 2279 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 -> 966 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3252 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 1951 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1823 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 9107 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 8732 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8738 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 4887 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 -> 9626 bytes .../__pycache__/labels.cpython-36.pyc | Bin 0 -> 4040 bytes .../__pycache__/mklabels.cpython-36.pyc | Bin 0 -> 1862 bytes .../__pycache__/tests.cpython-36.pyc | Bin 0 -> 5018 bytes .../__pycache__/x_user_defined.cpython-36.pyc | Bin 0 -> 2615 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 + lib/python3.6/site-packages/pip/baseparser.py | 293 + lib/python3.6/site-packages/pip/cmdoptions.py | 633 ++ .../site-packages/pip/commands/__init__.py | 86 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2028 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 0 -> 1269 bytes .../__pycache__/completion.cpython-36.pyc | Bin 0 -> 2600 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 5385 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2582 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 0 -> 1923 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 0 -> 1074 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 9856 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 0 -> 9685 bytes .../__pycache__/search.cpython-36.pyc | Bin 0 -> 4164 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 0 -> 5335 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 0 -> 2560 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5422 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 -> 3957 bytes .../__pycache__/dictconfig.cpython-36.pyc | Bin 0 -> 13604 bytes .../site-packages/pip/compat/dictconfig.py | 565 ++ lib/python3.6/site-packages/pip/download.py | 906 +++ lib/python3.6/site-packages/pip/exceptions.py | 244 + lib/python3.6/site-packages/pip/index.py | 1102 ++++ lib/python3.6/site-packages/pip/locations.py | 182 + .../site-packages/pip/models/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 223 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 0 -> 827 bytes .../site-packages/pip/models/index.py | 16 + .../site-packages/pip/operations/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 137 bytes .../__pycache__/check.cpython-36.pyc | Bin 0 -> 1424 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2881 bytes .../site-packages/pip/operations/check.py | 49 + .../site-packages/pip/operations/freeze.py | 132 + lib/python3.6/site-packages/pip/pep425tags.py | 324 + .../site-packages/pip/req/__init__.py | 10 + .../req/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 404 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 0 -> 8419 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 0 -> 30120 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 0 -> 20967 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 0 -> 6282 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 -> 22198 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 7701 bytes .../utils/__pycache__/build.cpython-36.pyc | Bin 0 -> 1315 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 0 -> 1728 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1018 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 583 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1366 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 0 -> 3242 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 3898 bytes .../utils/__pycache__/outdated.cpython-36.pyc | Bin 0 -> 4223 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 0 -> 1986 bytes .../setuptools_build.cpython-36.pyc | Bin 0 -> 327 bytes .../pip/utils/__pycache__/ui.cpython-36.pyc | Bin 0 -> 9583 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 + lib/python3.6/site-packages/pip/utils/ui.py | 344 + .../site-packages/pip/vcs/__init__.py | 366 ++ .../vcs/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11102 bytes .../pip/vcs/__pycache__/bazaar.cpython-36.pyc | Bin 0 -> 3655 bytes .../pip/vcs/__pycache__/git.cpython-36.pyc | Bin 0 -> 8795 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 0 -> 3568 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 0 -> 7107 bytes lib/python3.6/site-packages/pip/vcs/bazaar.py | 116 + lib/python3.6/site-packages/pip/vcs/git.py | 300 + .../site-packages/pip/vcs/mercurial.py | 103 + .../site-packages/pip/vcs/subversion.py | 269 + lib/python3.6/site-packages/pip/wheel.py | 853 +++ .../site-packages/pkg_resources/__init__.py | 3051 +++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 95307 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 18577 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201073 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24448 bytes .../pkg_resources/_vendor/appdirs.py | 552 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 687 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 525 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 972 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2829 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 7991 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3848 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19791 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 456 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10566 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 287 + .../_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 -> 2382 bytes .../DESCRIPTION.rst | 243 + .../setuptools-28.8.0.dist-info/INSTALLER | 1 + .../setuptools-28.8.0.dist-info/METADATA | 272 + .../setuptools-28.8.0.dist-info/RECORD | 143 + .../setuptools-28.8.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 63 + .../setuptools-28.8.0.dist-info/metadata.json | 1 + .../setuptools-28.8.0.dist-info/top_level.txt | 3 + .../setuptools-28.8.0.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 160 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 5653 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 0 -> 5116 bytes .../__pycache__/depends.cpython-36.pyc | Bin 0 -> 5786 bytes .../__pycache__/dist.cpython-36.pyc | Bin 0 -> 32126 bytes .../__pycache__/extension.cpython-36.pyc | Bin 0 -> 1933 bytes .../__pycache__/glob.cpython-36.pyc | Bin 0 -> 3801 bytes .../__pycache__/launch.cpython-36.pyc | Bin 0 -> 812 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 0 -> 2391 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 0 -> 4481 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 0 -> 31234 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 0 -> 3149 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 0 -> 32448 bytes .../__pycache__/py26compat.cpython-36.pyc | Bin 0 -> 1021 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 0 -> 570 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 1851 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 15491 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 0 -> 1464 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 6317 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 0 -> 1127 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 281 bytes .../windows_support.cpython-36.pyc | Bin 0 -> 969 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 -> 670 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 0 -> 2392 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 0 -> 13622 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 0 -> 1735 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 0 -> 936 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 0 -> 9962 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 0 -> 8531 bytes .../__pycache__/develop.cpython-36.pyc | Bin 0 -> 5848 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 63942 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 0 -> 21015 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 3932 bytes .../install_egg_info.cpython-36.pyc | Bin 0 -> 2397 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 0 -> 4042 bytes .../install_scripts.cpython-36.pyc | Bin 0 -> 2237 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 4582 bytes .../__pycache__/register.cpython-36.pyc | Bin 0 -> 552 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 0 -> 2538 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 0 -> 883 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 0 -> 6067 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 0 -> 4561 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 0 -> 7410 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 0 -> 1311 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 0 -> 5980 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 472 ++ .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 197 + .../setuptools/command/easy_install.py | 2287 +++++++ .../setuptools/command/egg_info.py | 697 ++ .../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 | 202 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 247 + .../setuptools/command/upload.py | 38 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/depends.py | 217 + .../site-packages/setuptools/dist.py | 914 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 291 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 | 186 + .../site-packages/setuptools/msvc.py | 1193 ++++ .../site-packages/setuptools/namespaces.py | 93 + .../site-packages/setuptools/package_index.py | 1115 ++++ .../site-packages/setuptools/py26compat.py | 31 + .../site-packages/setuptools/py27compat.py | 18 + .../site-packages/setuptools/py31compat.py | 56 + .../site-packages/setuptools/sandbox.py | 492 ++ .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 250 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../setuptools/windows_support.py | 29 + lib64 | 1 + pyvenv.cfg | 3 + 651 files changed, 110466 insertions(+) create mode 100644 bin/activate create mode 100644 bin/activate.csh create mode 100644 bin/activate.fish create mode 100755 bin/easy_install create mode 100755 bin/easy_install-3.6 create mode 100755 bin/pip create mode 100755 bin/pip3 create mode 100755 bin/pip3.6 create mode 120000 bin/python create mode 120000 bin/python3 create mode 100644 lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/easy_install.py create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json create mode 100644 lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt create mode 100644 lib/python3.6/site-packages/pip/__init__.py create mode 100644 lib/python3.6/site-packages/pip/__main__.py create mode 100644 lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/basecommand.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/baseparser.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/index.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/status_codes.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/__pycache__/wheel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/ordereddict.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/appdirs.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/win32.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/compat.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/database.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/index.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/locators.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/markers.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/resources.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/util.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/version.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/distro.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/ipaddress.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/ordereddict.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/markers.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/utils.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/packaging/version.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/bar.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/counter.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/helpers.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/progress/spinner.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/pyparsing.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/re-vendor.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/adapters.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/api.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/auth.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/cacert.pem create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/certs.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/compat.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/cookies.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/hooks.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/models.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/big5freq.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/big5prober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/chardetect.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/chardistribution.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/compat.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/constants.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/cp949prober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/escprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/escsm.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euckrprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euctwfreq.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/euctwprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/gb2312freq.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/gb2312prober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/hebrewprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/jisfreq.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/jpcntx.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langbulgarianmodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langcyrillicmodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langgreekmodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langhebrewmodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langhungarianmodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/langthaimodel.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/latin1prober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcsgroupprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sbcsgroupprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/chardet/utf8prober.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/_collections.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/connection.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/connectionpool.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/appengine.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/contrib/socks.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/fields.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/filepost.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/request.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/response.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/request.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/response.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/retry.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/util/url.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/sessions.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/structures.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/requests/utils.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/retrying.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/six.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 lib/python3.6/site-packages/pip/basecommand.py create mode 100644 lib/python3.6/site-packages/pip/baseparser.py create mode 100644 lib/python3.6/site-packages/pip/cmdoptions.py create mode 100644 lib/python3.6/site-packages/pip/commands/__init__.py create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/check.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/completion.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/download.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/freeze.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/hash.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/help.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/install.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/list.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/search.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/show.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/uninstall.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/__pycache__/wheel.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/commands/check.py create mode 100644 lib/python3.6/site-packages/pip/commands/completion.py create mode 100644 lib/python3.6/site-packages/pip/commands/download.py create mode 100644 lib/python3.6/site-packages/pip/commands/freeze.py create mode 100644 lib/python3.6/site-packages/pip/commands/hash.py create mode 100644 lib/python3.6/site-packages/pip/commands/help.py create mode 100644 lib/python3.6/site-packages/pip/commands/install.py create mode 100644 lib/python3.6/site-packages/pip/commands/list.py create mode 100644 lib/python3.6/site-packages/pip/commands/search.py create mode 100644 lib/python3.6/site-packages/pip/commands/show.py create mode 100644 lib/python3.6/site-packages/pip/commands/uninstall.py create mode 100644 lib/python3.6/site-packages/pip/commands/wheel.py create mode 100644 lib/python3.6/site-packages/pip/compat/__init__.py create mode 100644 lib/python3.6/site-packages/pip/compat/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/compat/__pycache__/dictconfig.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/compat/dictconfig.py create mode 100644 lib/python3.6/site-packages/pip/download.py create mode 100644 lib/python3.6/site-packages/pip/exceptions.py create mode 100644 lib/python3.6/site-packages/pip/index.py create mode 100644 lib/python3.6/site-packages/pip/locations.py create mode 100644 lib/python3.6/site-packages/pip/models/__init__.py create mode 100644 lib/python3.6/site-packages/pip/models/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/models/__pycache__/index.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/models/index.py create mode 100644 lib/python3.6/site-packages/pip/operations/__init__.py create mode 100644 lib/python3.6/site-packages/pip/operations/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/operations/__pycache__/check.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/operations/__pycache__/freeze.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/operations/check.py create mode 100644 lib/python3.6/site-packages/pip/operations/freeze.py create mode 100644 lib/python3.6/site-packages/pip/pep425tags.py create mode 100644 lib/python3.6/site-packages/pip/req/__init__.py create mode 100644 lib/python3.6/site-packages/pip/req/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/req/__pycache__/req_file.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/req/__pycache__/req_install.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/req/__pycache__/req_set.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/req/__pycache__/req_uninstall.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/req/req_file.py create mode 100644 lib/python3.6/site-packages/pip/req/req_install.py create mode 100644 lib/python3.6/site-packages/pip/req/req_set.py create mode 100644 lib/python3.6/site-packages/pip/req/req_uninstall.py create mode 100644 lib/python3.6/site-packages/pip/status_codes.py create mode 100644 lib/python3.6/site-packages/pip/utils/__init__.py create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/appdirs.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/build.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/deprecation.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/encoding.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/filesystem.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/glibc.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/hashes.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/logging.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/outdated.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/packaging.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/setuptools_build.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/__pycache__/ui.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/utils/appdirs.py create mode 100644 lib/python3.6/site-packages/pip/utils/build.py create mode 100644 lib/python3.6/site-packages/pip/utils/deprecation.py create mode 100644 lib/python3.6/site-packages/pip/utils/encoding.py create mode 100644 lib/python3.6/site-packages/pip/utils/filesystem.py create mode 100644 lib/python3.6/site-packages/pip/utils/glibc.py create mode 100644 lib/python3.6/site-packages/pip/utils/hashes.py create mode 100644 lib/python3.6/site-packages/pip/utils/logging.py create mode 100644 lib/python3.6/site-packages/pip/utils/outdated.py create mode 100644 lib/python3.6/site-packages/pip/utils/packaging.py create mode 100644 lib/python3.6/site-packages/pip/utils/setuptools_build.py create mode 100644 lib/python3.6/site-packages/pip/utils/ui.py create mode 100644 lib/python3.6/site-packages/pip/vcs/__init__.py create mode 100644 lib/python3.6/site-packages/pip/vcs/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/vcs/__pycache__/bazaar.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/vcs/__pycache__/git.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/vcs/__pycache__/mercurial.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/vcs/__pycache__/subversion.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pip/vcs/bazaar.py create mode 100644 lib/python3.6/site-packages/pip/vcs/git.py create mode 100644 lib/python3.6/site-packages/pip/vcs/mercurial.py create mode 100644 lib/python3.6/site-packages/pip/vcs/subversion.py create mode 100644 lib/python3.6/site-packages/pip/wheel.py create mode 100644 lib/python3.6/site-packages/pkg_resources/__init__.py create mode 100644 lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 lib/python3.6/site-packages/pkg_resources/_vendor/six.py create mode 100644 lib/python3.6/site-packages/pkg_resources/extern/__init__.py create mode 100644 lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/DESCRIPTION.rst create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/INSTALLER create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/METADATA create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/RECORD create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/WHEEL create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/dependency_links.txt create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/entry_points.txt create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/metadata.json create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/top_level.txt create mode 100644 lib/python3.6/site-packages/setuptools-28.8.0.dist-info/zip-safe create mode 100644 lib/python3.6/site-packages/setuptools/__init__.py create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/py26compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/archive_util.py create mode 100644 lib/python3.6/site-packages/setuptools/cli-32.exe create mode 100644 lib/python3.6/site-packages/setuptools/cli-64.exe create mode 100644 lib/python3.6/site-packages/setuptools/cli.exe create mode 100644 lib/python3.6/site-packages/setuptools/command/__init__.py create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/command/alias.py create mode 100644 lib/python3.6/site-packages/setuptools/command/bdist_egg.py create mode 100644 lib/python3.6/site-packages/setuptools/command/bdist_rpm.py create mode 100644 lib/python3.6/site-packages/setuptools/command/bdist_wininst.py create mode 100644 lib/python3.6/site-packages/setuptools/command/build_ext.py create mode 100644 lib/python3.6/site-packages/setuptools/command/build_py.py create mode 100644 lib/python3.6/site-packages/setuptools/command/develop.py create mode 100644 lib/python3.6/site-packages/setuptools/command/easy_install.py create mode 100644 lib/python3.6/site-packages/setuptools/command/egg_info.py create mode 100644 lib/python3.6/site-packages/setuptools/command/install.py create mode 100644 lib/python3.6/site-packages/setuptools/command/install_egg_info.py create mode 100644 lib/python3.6/site-packages/setuptools/command/install_lib.py create mode 100644 lib/python3.6/site-packages/setuptools/command/install_scripts.py create mode 100644 lib/python3.6/site-packages/setuptools/command/launcher manifest.xml create mode 100644 lib/python3.6/site-packages/setuptools/command/py36compat.py create mode 100644 lib/python3.6/site-packages/setuptools/command/register.py create mode 100644 lib/python3.6/site-packages/setuptools/command/rotate.py create mode 100644 lib/python3.6/site-packages/setuptools/command/saveopts.py create mode 100644 lib/python3.6/site-packages/setuptools/command/sdist.py create mode 100644 lib/python3.6/site-packages/setuptools/command/setopt.py create mode 100644 lib/python3.6/site-packages/setuptools/command/test.py create mode 100644 lib/python3.6/site-packages/setuptools/command/upload.py create mode 100644 lib/python3.6/site-packages/setuptools/command/upload_docs.py create mode 100644 lib/python3.6/site-packages/setuptools/depends.py create mode 100644 lib/python3.6/site-packages/setuptools/dist.py create mode 100644 lib/python3.6/site-packages/setuptools/extension.py create mode 100644 lib/python3.6/site-packages/setuptools/extern/__init__.py create mode 100644 lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 lib/python3.6/site-packages/setuptools/glob.py create mode 100644 lib/python3.6/site-packages/setuptools/gui-32.exe create mode 100644 lib/python3.6/site-packages/setuptools/gui-64.exe create mode 100644 lib/python3.6/site-packages/setuptools/gui.exe create mode 100644 lib/python3.6/site-packages/setuptools/launch.py create mode 100644 lib/python3.6/site-packages/setuptools/lib2to3_ex.py create mode 100644 lib/python3.6/site-packages/setuptools/monkey.py create mode 100644 lib/python3.6/site-packages/setuptools/msvc.py create mode 100644 lib/python3.6/site-packages/setuptools/namespaces.py create mode 100644 lib/python3.6/site-packages/setuptools/package_index.py create mode 100644 lib/python3.6/site-packages/setuptools/py26compat.py create mode 100644 lib/python3.6/site-packages/setuptools/py27compat.py create mode 100644 lib/python3.6/site-packages/setuptools/py31compat.py create mode 100644 lib/python3.6/site-packages/setuptools/sandbox.py create mode 100644 lib/python3.6/site-packages/setuptools/script (dev).tmpl create mode 100644 lib/python3.6/site-packages/setuptools/script.tmpl create mode 100644 lib/python3.6/site-packages/setuptools/site-patch.py create mode 100644 lib/python3.6/site-packages/setuptools/ssl_support.py create mode 100644 lib/python3.6/site-packages/setuptools/unicode_utils.py create mode 100644 lib/python3.6/site-packages/setuptools/version.py create mode 100644 lib/python3.6/site-packages/setuptools/windows_support.py create mode 120000 lib64 create mode 100644 pyvenv.cfg diff --git a/bin/activate b/bin/activate new file mode 100644 index 0000000..8333a82 --- /dev/null +++ b/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # 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:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_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="/home/jcguy/TAMU/mocha-server" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(mocha-server) " != x ] ; then + PS1="(mocha-server) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +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:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/bin/activate.csh b/bin/activate.csh new file mode 100644 index 0000000..d600579 --- /dev/null +++ b/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/jcguy/TAMU/mocha-server" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("mocha-server" != "") then + set env_name = "mocha-server" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/bin/activate.fish b/bin/activate.fish new file mode 100644 index 0000000..c9e43b5 --- /dev/null +++ b/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/jcguy/TAMU/mocha-server" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(mocha-server) " + printf "%s%s" "(mocha-server) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/bin/easy_install b/bin/easy_install new file mode 100755 index 0000000..030ab70 --- /dev/null +++ b/bin/easy_install @@ -0,0 +1,11 @@ +#!/home/jcguy/TAMU/mocha-server/bin/python + +# -*- 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/bin/easy_install-3.6 b/bin/easy_install-3.6 new file mode 100755 index 0000000..030ab70 --- /dev/null +++ b/bin/easy_install-3.6 @@ -0,0 +1,11 @@ +#!/home/jcguy/TAMU/mocha-server/bin/python + +# -*- 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/bin/pip b/bin/pip new file mode 100755 index 0000000..ef7873f --- /dev/null +++ b/bin/pip @@ -0,0 +1,11 @@ +#!/home/jcguy/TAMU/mocha-server/bin/python + +# -*- 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/bin/pip3 b/bin/pip3 new file mode 100755 index 0000000..ef7873f --- /dev/null +++ b/bin/pip3 @@ -0,0 +1,11 @@ +#!/home/jcguy/TAMU/mocha-server/bin/python + +# -*- 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/bin/pip3.6 b/bin/pip3.6 new file mode 100755 index 0000000..ef7873f --- /dev/null +++ b/bin/pip3.6 @@ -0,0 +1,11 @@ +#!/home/jcguy/TAMU/mocha-server/bin/python + +# -*- 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/bin/python b/bin/python new file mode 120000 index 0000000..acd4152 --- /dev/null +++ b/bin/python @@ -0,0 +1 @@ +/usr/bin/python \ No newline at end of file diff --git a/bin/python3 b/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc b/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebb1f912bc1dbb8c6d997a52a58fe0d7205abfb1 GIT binary patch literal 275 zcmYk!y-LJD5C`zt-RK4Jou(1K#b?s>mYoP_2^w1R;W&%l7P zYbduK_pSz8#9LLI%doz%Axf=_l`}?K8goP=JB#>{I4IeeP3L8qjWa}YE5zx=N}~|l zgP`KzqjNe`zd)rDirtUei)6e&zn#W+`#h|p@wM;#@@D8XEsvV`aCaP<`cJC=3zc7w T`H68fXm!dG6DBL;IooAl&?-#d literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/easy_install.py b/lib/python3.6/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/lib/python3.6/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst b/lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..8ef94c4 --- /dev/null +++ b/lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,39 @@ +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/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER b/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA b/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA new file mode 100644 index 0000000..600a905 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD b/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD new file mode 100644 index 0000000..b8b3e47 --- /dev/null +++ b/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=pjq8iYLQXdYySv6NPNpVnpraioM1_yy3qXr3UqTUPbc,230 +../../../bin/pip3,sha256=pjq8iYLQXdYySv6NPNpVnpraioM1_yy3qXr3UqTUPbc,230 +../../../bin/pip3.6,sha256=pjq8iYLQXdYySv6NPNpVnpraioM1_yy3qXr3UqTUPbc,230 +pip-9.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__pycache__/wheel.cpython-36.pyc,, +pip/__pycache__/status_codes.cpython-36.pyc,, +pip/__pycache__/pep425tags.cpython-36.pyc,, +pip/__pycache__/locations.cpython-36.pyc,, +pip/__pycache__/index.cpython-36.pyc,, +pip/__pycache__/exceptions.cpython-36.pyc,, +pip/__pycache__/download.cpython-36.pyc,, +pip/__pycache__/cmdoptions.cpython-36.pyc,, +pip/__pycache__/baseparser.cpython-36.pyc,, +pip/__pycache__/basecommand.cpython-36.pyc,, +pip/__pycache__/__main__.cpython-36.pyc,, +pip/__pycache__/__init__.cpython-36.pyc,, +pip/vcs/__pycache__/subversion.cpython-36.pyc,, +pip/vcs/__pycache__/mercurial.cpython-36.pyc,, +pip/vcs/__pycache__/git.cpython-36.pyc,, +pip/vcs/__pycache__/bazaar.cpython-36.pyc,, +pip/vcs/__pycache__/__init__.cpython-36.pyc,, +pip/utils/__pycache__/ui.cpython-36.pyc,, +pip/utils/__pycache__/setuptools_build.cpython-36.pyc,, +pip/utils/__pycache__/packaging.cpython-36.pyc,, +pip/utils/__pycache__/outdated.cpython-36.pyc,, +pip/utils/__pycache__/logging.cpython-36.pyc,, +pip/utils/__pycache__/hashes.cpython-36.pyc,, +pip/utils/__pycache__/glibc.cpython-36.pyc,, +pip/utils/__pycache__/filesystem.cpython-36.pyc,, +pip/utils/__pycache__/encoding.cpython-36.pyc,, +pip/utils/__pycache__/deprecation.cpython-36.pyc,, +pip/utils/__pycache__/build.cpython-36.pyc,, +pip/utils/__pycache__/appdirs.cpython-36.pyc,, +pip/utils/__pycache__/__init__.cpython-36.pyc,, +pip/req/__pycache__/req_uninstall.cpython-36.pyc,, +pip/req/__pycache__/req_set.cpython-36.pyc,, +pip/req/__pycache__/req_install.cpython-36.pyc,, +pip/req/__pycache__/req_file.cpython-36.pyc,, +pip/req/__pycache__/__init__.cpython-36.pyc,, +pip/operations/__pycache__/freeze.cpython-36.pyc,, +pip/operations/__pycache__/check.cpython-36.pyc,, +pip/operations/__pycache__/__init__.cpython-36.pyc,, +pip/models/__pycache__/index.cpython-36.pyc,, +pip/models/__pycache__/__init__.cpython-36.pyc,, +pip/compat/__pycache__/dictconfig.cpython-36.pyc,, +pip/compat/__pycache__/__init__.cpython-36.pyc,, +pip/commands/__pycache__/wheel.cpython-36.pyc,, +pip/commands/__pycache__/uninstall.cpython-36.pyc,, +pip/commands/__pycache__/show.cpython-36.pyc,, +pip/commands/__pycache__/search.cpython-36.pyc,, +pip/commands/__pycache__/list.cpython-36.pyc,, +pip/commands/__pycache__/install.cpython-36.pyc,, +pip/commands/__pycache__/help.cpython-36.pyc,, +pip/commands/__pycache__/hash.cpython-36.pyc,, +pip/commands/__pycache__/freeze.cpython-36.pyc,, +pip/commands/__pycache__/download.cpython-36.pyc,, +pip/commands/__pycache__/completion.cpython-36.pyc,, +pip/commands/__pycache__/check.cpython-36.pyc,, +pip/commands/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/__pycache__/six.cpython-36.pyc,, +pip/_vendor/__pycache__/retrying.cpython-36.pyc,, +pip/_vendor/__pycache__/re-vendor.cpython-36.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pip/_vendor/__pycache__/ordereddict.cpython-36.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-36.pyc,, +pip/_vendor/__pycache__/distro.cpython-36.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pip/_vendor/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/retry.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-36.pyc,, +pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/helpers.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc,, diff --git a/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL b/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/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/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt b/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt new file mode 100644 index 0000000..c02a8d5 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json b/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json new file mode 100644 index 0000000..9eae02c --- /dev/null +++ b/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/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt b/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/lib/python3.6/site-packages/pip/__init__.py b/lib/python3.6/site-packages/pip/__init__.py new file mode 100644 index 0000000..9c1d8f9 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/__main__.py b/lib/python3.6/site-packages/pip/__main__.py new file mode 100644 index 0000000..5556539 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f200de37ce1de6d4db5bedf9449e5abb981ec48 GIT binary patch literal 8375 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f4412dbc961cf2545a404d7774d69060fa5156d GIT binary patch literal 374 zcmYjL%TB{E5cDHyoVMX1@e>s)Jp_phLYz=fT)5?8rP!rT=7tItrw7fx5j56V6TjysckA3W=%xCS*d{U9DwI zSgSS)BeiqV`aq2`u^r_&FW;08NnG=e>^TG<;OBDTwOPRIeATN~%&$xT+T6G@whr}o e+LhS{cB?zlxAG2y-<<(W3BxR5=>KYBaV-?T_}@9%eVp;9Xm?X2f{gUioXbV`nN_ouyW_ z>Z6^NElW*nIcOGUh%h?=yTJm!a)2OUA>hJ^6GRXkIpu*1C;tl$4*XtLtL5f64!A>-QR(_Fvj-e-`TB$CF;tHH~R4jp@t?^~h)$I@Qh4 zY?tz)WQ4CkZct>e*&)(O=vg(ss^ty9tI)@ju) zhi9UZ(2!UWhKX zE}~xR>a9z@*}LpF_Vw14k2E&TYF~ivzqfC;uA)7|j-Y+Szl!!XW_jZ-iy(

kWwDZ3kQo+MyqB)6n}t|AC*T7+cTD;_WsY%Oa;& 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc7d7c2ff6f6b972b51612798e96c7f78f495abc GIT binary patch literal 12929 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%0DB+WL1S2WJx{-2d@C2Yt z>0^uJTbwESaO#z)+-wTZYBr;4v$=uq?C{-1Q-Kc z&Vlo-u!C@+LCMOmCQiN=5q??ZpT$VmbYuoXM8E_EQERP9hN`m%vN#;A-Mxr=I- z8bc}`q+&8fBP$!_!2;?N)UZbdNi#myAzA($RmbBmN#pPRP9aF7QDe4=Zv^$XfTMiS z8gW3Oq#kutxrnpIrQUNCTl>UM2(NNuP$-q$iToJ8_8ZGr#ww-iNxC4>Dep>rbIn&K zxk?ewT#^jeZRuP7V6U`=dO=xHSs|=+%%Rb-3c^VK88co5!MHWWIPjLQOeFnM+;pUP z)_4VlY^78gAHt?xj}Ac!2QZ2U+YexmR`Aa=$Fo*S!x%$v#Yz!tz$y;R!W7h)!@Jj% zA?2U!CB{nW!7amc4vsc}r$^TPFv5$#*OnJin EU%d$@>;M1& literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a983228c1fc1c408f19566d65c55fa7ade24ff GIT binary patch literal 20310 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

DqaduijIj`-^;qoIOM_D5 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 n`?1+KWQ<cUhecyD?Js1pb?8#;C#l0A?@;_H}~` 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7a7ce5d91f7825488673c5770165e09a21c71bb GIT binary patch literal 3869 zcmai0&2rqv5uO3C02cehB}Gx9WXbTKthL3Z9lPQxm+VAkEp3%0+7X$^-YORgi{ z!~*bORwUP84q4?ESDafOAeZC;Qk54--eC^DrfHf*6D_G9ZjHBcT&xU{IvZ#2lEqw-$YEP}5_3U_);u z&cq$KTDF$dC*HuDGzJYlwv*0pJ`2N#$(SY-{? zd_o2nS&OxyUt>$G1N|kwHYeh5+#FvXuXB5Rg)PsG!PWHV$7>6oIeuwQD()kaUbhIp zcHoI0DZxKzTxTnDO3BwGHNGNR=Vg8sR=&#Ju|Fq+S9opw>fklrW*30_I&b|zg*><3 zDy;X$V*DDz(G5L%lfN;iKhWagIoXRpk;Tyswl=uAka!(VYz(@KQJ3F@(Oc>G|L9*j zr+@i>_2GnXGn1|V-dHE>%7Fp9|55wNWLGusrHaR{4c=ha*~?GR_qWjZcL|(#gT2OH zVXr=+gB~+?NcZ*G2lulmlyR08{^33s+&|=gl4S?}C=-5^rK5PSxaG%bA;To`3ppK) zZuwkBPZ3jHs+PiGktI{fgLsl>LT&@EUK|&dYS&QCLRU3*KKZQwpdWnR|9S`ckM3>X z{o>J%^7v66rfgbp0lH3@=PVY5GV?f}{bP4OF8ooPa3A_S2_w#Yz0KjV4+6f-U~epj zBXD2tbHB)@B7#GNAU&1dInkcyeUZYHM2mSC9fW(@XfcfPA99cJgi8>(IZYGL^N+KsFZd*TyfBTM?e@IcHQ3%pCA@*gHsDk|l9@Q}$s-w2 z^dJ08`0DU|0$=enXe1fau~8Cf&W#f)t&%c2H~!c;F-l`xlQyFJ5n;x!$V2iK^l*#j z>=&L7zegfoxB*>Lt?f@jalpmGhbj0=pX~W&w5Fnm+g(Q)S)r^vl>5pWXK|{oe0lH7 z;BNnZf43hzxbyJy{=;DF-u?deodg7k?`Bpue+o=hJ@IRQ0okl#8Cx z#_QFdf>HigA|OGLXSX)xB;Q1j4X1I!Hr{_vemnl4cn?|nOHNVR%a7G%y=YJ!FgP^^ z)~}-zZD@$qrcEj?0Tto!^j8Byd-^RPB$3*;qK#gZ;B{#N2fnc}HxEp41NqDX57%Z7 zw4WYwITfkDE2e;*5yZ-y5HVt!rg6H5;E4e!q5n7*avCN)eSFK`3X_8S8DLW!#svoy z;!UZB;9(Nvf{)^(UDX(d1z(J|x|VYG!y=SYC=(({*_D`b_P9i@cGFY~eveY96)dDzyxOeme6D)B%k`?U#>XP$5varnJVjIi1s!ifflpBQ!1@ z$kQKc8MlOa@uBt=<`ipz#ut1Qr|22*i4VcMd$%spPt{VD;{yaQUI8R^qxX)!mKR+3%)6b$g^aRE z{_!C!Rp8<_74JZ|73qKlstq4{R0DAz5+pn~jD$?+iA_mNPMp#bJ`_J|kH+-GO)cQL ztX2{j)yq00O(=7ely+GMzSMd4Wo>TE z>F;Ps^T%al?39hbDXDnEJfPgNmj3~`uBMIr&p_9Ku9s&17obrFzHtLrI=U{KcgZ(v zCr#NZ8>~?_FOj)XI%V@V`S$OSw41P(HiHy?V2l5h4kVl<(Cy&ITHnJiD3Qx^0!5w4 zmGOn~s=PRMSsNcmK&`Q5wt_|e65Q0hRyyp$ZBm+S`JjHLaY^f4#<_JU_;bou*U3q% zvR0a9i>xGg|yQk+&qzliqvglj2*wF^ph^Dan#+2*@hmhp*3Y&K*;HRJq*wjI)gaXurMxQHPQaGH z6eS#JR2{jMDa=)>jh7!pA%sU&OMblrucS}zz*{%Cd+(uGMor9Y`Y}>n?hPDb^{Q%< zMve!CWAOq|HXtuLWXkzsr$U;=k7B8>TD1|C70?3=ftIdhrv*~g_3}IScKfQXcUBcc zO=79Dp#*@saK3(3x9+ywrVV&7 k02yt>mEE)uHTZRa)7Gs8J>teSk#{<>Yd67$4frGUzd7bJlmGw# literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc b/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c1d1252e9c472847b61fc9d3b63fb82b1af06fb GIT binary patch literal 7464 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 Mz1iK```6gN0d;a%$p8QV literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97c33e15ad104292b670a22387b392b271b74d07 GIT binary patch literal 18560 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22dc11a3750aa1132e6c4c365edc447ce373ee2f GIT binary patch literal 66367 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 bR0)vtd_svMOAimU!Fpo3J5;`$!E@qo>9ply literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8c5ebb083f287d34a911e522e6987d72247600a GIT binary patch literal 201056 zcmeFad0<@ET`xYnMx(`Ryv0ebWyg{dNnYb5j$`6AapTBo>@=yeOh-Cb@<^i@`QDK& z$)hfj(>N_@(*mWGQc@baKnoNKU4T;BQlONjw6t(pnwH1!(f1zk;IZ@t9{fI^?>ToH z$xGV2_j`Z*WY4|#+T;^-|g(`=qP-lX3WqP^a9N4K0)V@}cFpw^UY4t{7U8Ow2NrudJM0HMA<3cqmb|G6{S2M8WxBGQofH z^&0*4)ro5AVV$D2(lNPaXsx8!Z&G|mr;r?5E9-*q>&*9mFga$2*6N(}RTWg5YF8bq zQ!P`=)e5yztx~JiHENAotJbOYYJ<8~ZB*B(>(vd)Qkztl+N`#y8`W0Tt$I|ix=G!v z`c%IfP}|gYwL|SxyVP!Vi`t`ZRkx|z)n0Xn+NbVR`_=cUyVL=7P#sc-)e&`6-L39X z$J8s-z3RBSPYtRQ>VEY~^?*95PN@ggtJFj4VfAV?q#jX^s>jshs;FM0N@`e*D5Y#Q zs>al5RaWC_LRHkHs;ZirQfHJiRvub!Z?Id(uU$y0ta6`BtxpVXv^T2E`h;>PQbX6- z*FBqZx)9^~p&M*#Xp`MFv>Ep;_Ko&dyW8%udy)Po`)0e(?zacV+J?4OhY@=_V(%E* zsp@L_LSkskSYl|KjOnhST{8#O+40>AiNlG<_6*%JyV~A1zQ?}R-eupikXlH}IBmc< z+%{1_$qhXc&!*13LXW|-sWY#5C}H2O&Z(IT345oST}U2IEF>3_LwnVnI*-!sxI3X5 zYW_k(&D;AH(nELJneqMjec#%|&|T`aLkH{w>UDTNXy0WY!2OWjrCyKpht(U#kEkak z-^}HO?;cok0d_Rux zQ|cy!Z<6%)A$(CijquY_yFrBCq_!fwRl+Cij`91)UumCUU#K^$JJF&C)c31F+)t`! z)V;W$Qg2aj#r;9`ta=;nuTpPUKY;r~>Ic<>xIg@C5)k$d^}`pEL$5~u?^Hd=zen;P zLik72c7(UvL#W>)2)|3MKzN1y2*Qsd{G;kxgs+wGV+g-ntw(shgdevbA1d09+e5|I z;LDGxHTbedzLXGtk7`G_-F_T74I}*Hstw^byM*uv!q2HGgr_9FLioLE7s9(FY$N;= z>Sly*mhdRT?^C@9_eyvS;pbHc!W|Mmjqp#Zoe1xga2etEs}CUj0SS*I{6V!E;nnsy z%AY{^Luwtu>m*!3_@~rbgx5-V65*d#0|*aDxQg(HRX@W060RZq5p@f~w@7#j;h#~v z5#BA~GYJ2z+Jf*F=~)NipHl^d3$}yuU4%cXEQBoy*Af1CwE^J`5}ro*7u0fumrM98 z!XHyz2zN<-=MerywG!c#_BrG?gYYk@jR<~7gs-#b5dS>F zpHh1e-Xq}#!oRG31>s*2$e6e17ZO9S#oJ$1H{k6JlFRE5{V`5$?1X@cjb9pI6r)e2s*kMEEzBmEL2W~Ln}nZ2_&3${2wyL?yr_OljRMA>28?f4zoQNV#@~eJ9qLQ!Eb zMx@iyiKc9sL7}BbPIkNHIC3P+t1@Ui}=4HPdPmOs{LV% z)?M}?d}%?RDJe0}K7TYd^y#5rvp-}1I=;1X1;o9;HE-y%_9&j)@M|AGVt;o0a|@{B zT7K^c>eY#OpU0bJs)#=Q4Ym=XH%+9TZFAmX597HDvA!ZtoALD3U<|gPwA9caA^$%@tQ*x=aNWwe zXnzRtzJ}TJCi`nrANEQ&-hCbS9{cNuRA4Gu9s`oQpKv+GuviMBO^hEeOAqp zSkta;)kZDH9-FR|9OOIY*shCI$i;f7Tt6LFv(K8XO&3(H+FiG*wyjvHid}M0WrWXJ z?rgPQnz2Tav-AOL=U0oxO_u5-r};8c2)dDV^*c!SZ2^rwTUP8^t5P0zO3p0nIAZ#{ ze!5g=RV>z>9fQi&o#~OfWMxXURN1jd>XlimT($0>#pqNA3Wa-Y$F|tb7K&g@rf1={ z)pd_usnq(chiXnmZR)amP~%c{7A>%C>2}nBRYmhAt-_)6UHjZpWx9?bsa5y)S^G*# zvFB`i|E8|_-ac!1x?HJS(^IG=+kE^yGFJ0_csO3h0GBFw=13ktf1s-7ExTe*+SR&i z6?%@J@4mTv-~FtWb40%$C>D`_vABQUs!btr9hDmcfVe^OaNPPV^ahGVE791}biLM( z9y)6~bs4fkSb^w3^zPkTC|LL#b!wC0m|K9Znp0=5DAczyb-D!TWxUNkp!*$;{wW2$ zB~hg7tUD!fk51cb-E4LBb>Ye!qc1mg>3mOf7?7xGJS4*@w5x9QNR&RStABr2pDuAg z#_*)HTYv8DHIvMYb8WglHI44oLx>{Ip^N-B$A;eO-)}wAEw8%!tnNNu1St5hsrxaV zuLdd18_pLDoWKF0lm+-*0!TYEjnPK5k}3^XY)m_rOQ>T!*RG8AV>VPunC~@bwjdyG zRZEk$tD%Fj%oGJspaP99!mDZ}HK0VumZ?Nl-L zGO{L809cWZYXZ5*7l7ReFw-!=X=H>zuB;L#QPp+{RF$$@M|CmfMg-qDvw~hq)q<(Q zIpPtv3hC+?q+uXMzt)Se;AzZ?3Lx99O$usa7htxc_a-@fnEQn5`s`GBq*THDK5Ngg zOV6FQtJXOO7?1sH&(!t2cHF%MAQ^<6k|3cnu$x53xVTfL5!>ov38mp0@U4#(&Xp?_ zK)YMBbZvZS6gb!fsMFACS$#l~L>QLEw|0GGpqIs+nXa*8%tVw5Ob*-R8~|HQ%0w^B z<#rD27}&9W?waklS|>12JGbxHV{PBDch?Tp%1a)ZT z!^wKdse5=Qh|w$D$Cct}*>Ul5uqGidhguw{&U&pUs`d%zzM5lu`4iR3?1}0KpQiLm z=cP_K-b$GV2hq4AGb6Tq@m9$@gHDfBF|0_|sb2<>mYJ}>2AWhyOZ8GE%&J{tnQ7*& zme5IA`@%RK^46baUi&KrAT)yV);|EU0K~*u`)*ATgz2&m*kksLmpeI8o;p?YT6GF` zRGWU(U6nsM4axu`=VedTChV%$DYrug&pTfBq0{J0F9YCIUJI|%*?iDB6ozc4X8N&J zaC3Ef()Ds0O?w4>ziqf&_u8-w9;(z_`&4NRAF8t_rtB)8J4Q~{XDc?~f)MScM`{&s zCE>et(w-_|m9o`wpayR_-_@%3oVxG$k!rmRcxfN0O;_>xfa8>Ay=5a)Q?Zb?j9D?i!6sjAhm7O69OUJUw$%%GaEI&zh9z5LX4bwmbl<&@Aqv1Ybw^kks1-LWTu`=q~JZv|Gg3b0~iu-eQk zQiEOrP=}sA&W>8U&5=Q^e8nC-Q?vJwl}>POv+%YlSPY?&ISc^%W$@<>ggmr1gC z?bB0{(d*#4all_NypD1eEya)@tN^2V%W6(}tPJY*6p%Y`j@L3>9TO~rh@<5h;0sxl zy*5NAEJ_ErGEbr0f!qkx8oT7{oJRMRro83Bf>hLC`|UK4>j*Xi^2Y#p_K8FIxv#;c zo@gZM$%T~D*+`sB%;xKc4k;L{v7@DO#kFMNF8Ns< zsdA`}I8M#!BmGjf$|f(%45L(q1w}KLnEMPJqA4&F-6v5R79bc|yUb9^C-CVGRrnSo;Tp%)J#ela&!HQCRj&$IRunZhlnVd`B=~95`&?Fg6&lEx4#;9Rt=# zD6r%9?63#iq zcyaf(`sCEMsq$1mNq^P9dsqF;_^s|PzLH<@EXJYcYzqKvU~1OO@2iw1hgE6+4%&U@)|wrbfY}4)3xi-Ik^n8wCZx7b5dqyZ`w-(#7JD!hYFD%XS1d4&J6R(O1&5G z=&r;iku4-MsZ=_j>P)Rp=98UC=SjSs+v848V&7N=fhSuMAV|L*Jx!GLl&_#44b3Th-CE6gVw$yY&Ubta`ae91wn7se_zu-!|}>RL*DS=AR? z_l?t#%OsqOxH%3kL0MV(U}pP%1XOY!94(aw-y}1hSb)rhGkB&80F`W{ z7E+MGtbQ~#pPtV&662{xx{<+5Pn_v`2v`F3%Fb;&;*ON2Y-=mFjC~e1jvyOB*OPMO zPPJrcM(!j)#FYl-vRn7>>*@|_#Hyz8BdE9=a6#)=qE3khxsUjnUPz&|^oz-@FDCEs z`@(r6qI*fVsWYV6A7FO68|JPrVvLKn)H4Ewevi$qDosvVV|5EtlM4xW3N;rnl69vl zpcc||WzczMHuh${44dJ#bMsMjXD5ei71t}&Yr%6?zIbW8YO0vm7OBWju!03#5}8bL zWpZ_LdD7vOAru6EoTPW*=eFZwCm>QyK%@#(3P30nK^<}C)ZIbUHeW1qLsBf_Ls7FG z@Z4T3o|!IH^p{9=0?2WG2swY4MXO_%3chFyWwf~GDW}D~ z74ligY7x6Yc`e?wsWdwH8s|D>J9q0ah%fB64B4%DHnLE0DuXDL&6fk>54)2vo-3Gk zaD?-Xf4sB4hwyVb?;2QDi-`tM^hDm-h`E+1g4c{|s@jfOhLF5VH8AgrY0kw)dX(=o zf)7%I&W|D&fMXh1)k{yhV_s&8XtRTL3ivEursRydgj#ORo%bS*^W(fchl`gXlcuT5 z2}tE?xn3-O3Q^qUxFnJ}pga6hIb3texoZWx#`Ys%=;%}<94Y?s&Sp!K*WjUnDLu{~ zng&#o98WJ~(9y}cj|A%hHOKSklZ!Po?0pt>^iI< zLtzn=sx>UX4z{tSv$Zmqnx{)=x%~Q7M&4uKS4?A93dYiC1*A8a0U+?fjGP`eT)H63 z-b_%`+h+8;EOfO;~Tf-Wj z6;=ni6kt6>{`$cv;U)qdt9de-7UD|_RQ@o!-0+WrwhJSpDHH6nnsUG!?6F@;9#ZBK z)xdbxO8`s^B`L5=)WdlNdegZb7cZyFhGdouh?Kl^ehPu!oQ@^4N9GaZOFXYLpy`E{ zM6&0ZR~B5b$wlDMRxE;WVgDA3zl&&YCoYK`=?U{o&0W6~ScJ)f#gpqpFvr#*Koo*G zW`-E|^k`-c7wXjDT-S}R)dNbH^rdy90!z1t-M05eFhbF4+5)l?O3?8D|Vft;`s zqtI{Qqn<>ULPt8@i|PHF_61XjwIuB<1@FTHdkY&D^p{GmOUwh&I=fX0*a;+2BTedA zqh2M?qiM6fNiVQZGjmTKAsde9A`V>wj)HsmzFY;T*3dzk3ksRZL~OspXtJvV^L_E8 zF}oIb${r~LIclmS+%*V^C+oo=29S^|5bI^eYh`e%xZY0TgTN&A`_6>zoYZS@o)zUN zVo%8@1N==0tb=Keu@Q{)P2?~1NFtL^~m=)IqzHdzt0fXw+2BYlLIpW)?adHE$?KFLeik@6%Y z4ao||kfk-B%%lr#?fLw&JoXiZ!U#SDf2`GA_({wdfg{AQa|6DW2GKx4sNw2YKka~P zq#4Llqy~WZd=8*%X?d40ZZtJ>ha|sB)c?KV{C*kCIG)xpcNNH97u~c}5JtFaUj>#o zy#!*vVna~kFJyIRHVp73d5S&cQuPjC+cpRk-qS_GWXyKDdSil_E|A7u;E$U>y}Ia` z5RL`}3sX%Cr!cm90KY*}=Ahqp>HgSjouBU-;GVTqN6Z1dg#^eiiFXM|8aHeWSV9ny zVDD)v93uSf0lwd%(fy7vJHN;sk|&W!d;&Nm1(yV7g5cj0L^-4LD>KQL1i+h+Xs${T zK)=8&d416}Is(UK@KdTTn6Km$X`tq)Bjk4qWK*MH!m2xfX=_s;;3D*S84O)j2G6WA z`%+rR`lT@ob?Z_uv2~l-x^Ikw_W|@Z5s0(m%y$S)Aw0tJAyd|;e<1}D@ed?UX2_49 z7t-P+nzj$3j)7tjgeDq+26Z;=2(2a%3O4gq}}=@)R=MoN^- zK`u639WISbaAlj2Au)n*n~X9L&o1JE-66gGQo55Jk`KBw-PD~#)OX?MTDZiq9oZA2 zKAgoJTRN-{EzVX%n;VKybh-;ctu~7U&z34>3XtZla$KAVradHGU@bx@40fdLpx?oN z)}oAnXkf+oJA|L?*kxyyFnk%X%vK0I8d1zCa)f;faC!6#MF){dB#QwTl$;>QCEQ>ky8Q7TtCuGJd~)x)OJ=p#y3xg2_bW)h^a?6#nH8zlrc369YN1ud;vneb zrH}?2sF%j2)23!Cl1TI=s9`~GT z1$-2|wZ;3n_8GC(L*SC17##&dA4wxG{_!64ABk|1dZV&0563nQ{v8Mep`B7wJFvgo zxzreLiFB5AiGsrsWU2h)J*Yte0g|JQO6RF2#IzkiYOHVP< zgzN}bp#dd7Fg^5S^Q)57mC(B^=d+03+%v5hXFb|CMe4KZQvDLd9t2)#f?@&S&#?@l z?YMc5lopb8pT>vHER6e^Ja{Gi=kVYanrS0sf zW?v-%(}sD4cTfog11lL}V8Pe`a9^Oo0q$)yI>5c%Zim?fj1TbKNdpAjm(d6T_vJK1 zzqN> zXug2^wJTK8ejl{7&p@h0&n_g2!VS)OdVhh zfiD9zh`^g|G>X7|I}Ian-$COD+;`GI0{2~t^!00;E{s#@7)DGMVQiV8k_9G_GV})o zhtx}f}*|MSP1k%9>CMSdOqNZ5bAk&_v z1_br&>55k@@<9sJ{mBMy*1!QUBeCW))Jl3gVaCA77lV$~BZzMGD-_?J?702*+qdo5 zxoy`D>{5b6VB>=g=hk}wx}()QiHdu}#<419Cjx#ERL5>~yQ~{69l6IwhxE9;_zSX= zthxxA25fsHTO$2YR}+AGsW08qN!^$FKA^jbRpXz|)T9AG80cS=c{e0&RLttWOdMUc z0X022)zb^n6^I$#wC0_aOg_JbTBVNNOBJ?lyzJN+Jnq^7r8-?z%hU~RXPRzF()`VD zy^gW7yXiYyFQ1Ta@M%%&8RL{QZAW4(YCYo|g$Oo`6l*>|KccI6rB?L=;%4_+yY!Bc zZS991F=pUiYsb!@3jG#mHC~~k@`SETE;mm!X3~t6z#}0Rpv9ej1=mKm9NFUdLs91(tT7)??l?aV2P+_8u@RPx62k- zR;IojvYi!B3V}ERG9Q#zT~l9PUxu7SGa-CWAy@YLVDA&Tpajy;V){AmiQ)Bv_7t-o5oraj|AkPjbC; z7lD-loYhS!G#o+Q3P81{>6;IFouJmMTG#m$n3oVFQ*m*L*nICyqYAxiUcSi7@9^>^UO1VW;hrS# zV}$#Ic%bkv`j5M`0)*9tWP6HaZl{C`A|Tv?w~X7KT%B5j?*IV5 z-!HHd8fkSV3#meKWomBSr7APRPT(K6Cc!w6(+<>>suLq`N3V*=whqAuCUt5IOnSa+ zB==!5a-%k%sUAlBWE~n|GH!#M+~Yt{jDfFP<9T3=k#3dgW}a&>Sx%C1Pr47jrgH2letuv0Q{o<43Y(#S`Gj=gR&5O0S_^_{*=gPGlF~p z)s5tx<~!Pc4?r+Ek#P2sBXKJh1BgZlmMPjQA(SQJA8#S*ehb$~EF!c}OD1L>M=!UI z7pTYc*iq>1WahIo`xNnR<>ye-am908e9y&WOII_!VwBiL0v2pkwMs}(3)geM7n3Pl>x zj?x2|Wly_atBw5vF{3Smi!pv4X$8EoL_;GN%Gz3~Qwjd^+G@biP?Ce1sOu%ioo`7| zpiQTtIt}d|F%w#1Y^h``?2>nJY^kr3kWtO2iNGL!O|1kB?F*R|*O`Mtb2Ei$BX+F*|Sq*Eh}AFjkCp6Du45hDqrQ zQd7=fu|Q6UrP+KWp3t|&;?J{O7Q2YFkt zYhD-h_gHC{Yo3?ESUQ($A5~cprC9vMOO~m>$I2ugl=0-;*Ih~iOr@So8=e?u0JZ8g z%1$}|#OKR29b@e41Qv_G6jY^ogu^(o>ZJYZYzeDF_1rZYp;8j9RXu{`E;Z=o*{%tD z*6q!BE#TOb0if59@36A0@g-oQRl1BxKhBzxnoVFqFQn$y#39lzVNqpSVRsEKPbI*t z0@k{azX&+dx`lw0^k9&L!^`Nq{3KX`JLi)ZF^$&yihmloWZsw+Sf+cd`a-T>L?)kR zotbMUF?aLg`U-|{Bg?O^1Bl#SM5<_}{xkE&y1?e@O z7h>s^4S3Khkqy%?qp777LxncEOwatfUu*OXEOA24_<%GGHJ|)$I;Ie&{)}G&`ep4U zN{Dq!FuB{&MuWSsoDrGKz3Kt6^3q~F((cOaq%DFb#F_!i4Euj$yS8&+2I>{~Ks|0_ zR2Y8UH89gV00`o;DW&ZXPu&{XUj zk;Z9TDZg=&a_P2lwT>>BbI+cHkl7aa>gf#`a3L_!MgT%ot@%N5D(p6=Mq$&2mJP%9 zSq$+4<_CBpGy%{u*h;N7LHV?{QHFsZ1=%Q!3}V>if+Yt%1|P&-Z7>O7^)g%&1#vIk zd_nF6$-fM`AlJtb(lpuM^@7Nxs+|y7o1PwyfMEA5w2ZG3XLO;)E zv46+5Z9d2QorwlWC4Au)qNUM-4V$PUmOkmT-N{>eKn!{~vDrnm{-j}rJqhDWOO&EU z%cAlijB#TUa3?tFCAU7`8|q2X#thnx5MM(d)WUa+!n|a9=sfq_^WcC_LZ7-kqKE3x z`KcPXg7acT!r?_B)mkvX(5wa33UvfAtOgK>iU`ys_3J)u`vENkO4a?+f)c`P&?uAx z2>}dtP%zDvMI8*aBYaE|SJO6~pQBYNg>3R_tqNP3c==Y(WX-4^K&)Ld`e)Dr5tEdl zTGH^KGC}pETclc$T8z{{Yr9i5=oNr9EpuGgGYY#w9*9c0hyh~j0D2X~D})}#{6&wT z$;R(3PNyJ;Ko_ac67>n-bWAZlNCRd}LVosQVFY1@TyDK*D2k0xkM6)GPB&wko@Kt< zL$)@*Xg+vgpV<>?1~uscZ3owLm$hpr`0Tx4GEW~DT2SFE`CdMv^e$V7aXcs*Um4;(ylTqG(>_CP!(7*o(w zLi)G_;=qA}Vb>Tgdqfn$T5Yx-#Qcy^FB%&j$WSv^qcHmG$e z-~=!sLac_HO+LnKoO7S}c#>1hKx};QBLE~laa921cUr7yw$cE-hPBvN>9nPXT*{5t zN`vIpb~H=o-y&fKUp~@}(YY*;_FGbey%r*d^XL2xC`*6)qSJeJ*f9qSy|qlKgB8);WKbs+nd)sg7@Ls%T2&Od(0K;R~S5A zR-~lx27|BdrXGT~n)lynRO_#~c3zLDiLMN|mtX;a5wIMLfp+{OTObF!uY7WDd5jQ5 z!lhM7)*&OZ0kGyR#~O!~4J#ZZ%Gz$HR0i1_0Dwr<5xtYJP0eoSQ$yJF@ z{Tz7LlTfD~V7ra<+Ti{sDc{m5PQ&E^{Vo7cg&iC$AKkInq1f*-dHE|32Q}z>V=8A9 zn9=~FU^)mOG))KR1;Fk`0I1&guONfJ3GC6_0PIOhw%~UNKX(Whuq1>lOv^!VBab4S zf|(Dwk+*4r5sKG#oUTaBUJ-IX~6?9VY5Cdwi5CgDHMKJ=`L9C_W`DLaRg3>tR zn}vj2yfW(ANfY&=8EL+}1u;qbRBJs-lwgk$D}ZaA&a8+msy)0=uZ1M%r70%UIotc# z?bW5$sU-=Afu_YSQt*|@8x+=kY08RPh-AchIi0Cyd2x&A{1;xRj^(c$SzvvM2aO9Y z75f`T`4%sK$IE}`CC(gh3P`k*^MjzD=%gVq1YGeAwJv&T7V&bV@+XNn=nbP3Y>KzM1Q(E|;^g@6A?fK(TyuR+NSUJ76-BBTE> zPD)x$$05_8dE+SvP{OT>QJg~aVE&`DJmfa;2lwAVbw1; zkDCBDEdR=Iy9j9etlhhJhiW3UHPeu*b2Typ;c+*cXgcixm!pJ2{1S=wCiv4C#NaQD zXo92-4;kWBaFAD%I)Qj80h3cf)ZDixeRR7TnFn1iFbRbypK0Mk9Ea!SflR&iXhImq z$5tG*1eM}&T?*24CkUV!zPb-=LS11)t%d1YeUENWEaF#~lPGM!!v&OO5Y`x@7=FJZ zz`=zF`UQJ8?F*pik@_Qh_xA62O!I)a(b3rTu_o|id1kNB-9119F2AT)vo(}1wRLE! zXcJ^s+zB;qxvDZTK5A7aToqCr@=1T;2RL`GjE+xKlnbBGZY3l^sPRwvsYs#?%<9(q zFxw(rH~UO8^6UiIo+8+aP@$thp+X#W>U?7Sx&U-FBb;i%D*0pzj3ZDQuy}>kQxn#6 zw+20Qh+h1}03?7@%{q!QCW6?oo|k4Ak>m&yFU@UpmZJruYylZ)iA;NPF3xV0w6U2- z*0#*NQ9R5-kgE3s&}~V;naW1vMjWfa!?I_9(R|K%T!e@zC^{TwBSq06N8cWz=m5tm zFm9LT^NX+OP|dI#L{#3Qjl*9?od+#7Z(0lg0xden&cN>y>JAh;6^jvhOOv`o#_^C= zuhOF8(1oA@BfTa!l}SsxNtU@1541O>$!rc94%BhjuvlUXYE{=E7!<-2D=dRT2_Ki^ z1sZ{Zi3wzgyD!cB6MXe`|FdF3E*r`wu%;9h3q!GZp7ql5GHx21*svy2P!C2V6tO<; zv$#N_pKz*lyjBgLVgPtWWY`FY-2$JyGL!nzPl+yw1 zrPEfivbxhmL81L3_qK_P+Q*F1&zJt8Cz%p1xtbVV=su%-#hJxrfn9}rVy-(%&`>u> zx-tqe+E+|~6WC|1_(@fE<3ZGR*m_Z8!%pLRn(>0OpQaiQM2Tr_%dh}_qPL~bEI&iF zo|IPWp%fQWUC6>rC_(eGX9=hR^=LyY>a?gCg#IVl3<49B0(-C65acK-LQ*tz9KMc( zp@?2{Izq(yO@5{Bis=4$x#=lxh<#NqoOS@6Fo8)ywqB<^lbI{wkQJgw1L9(&a8~mo zQZ96ojHppTHE=d`HGJAkvEK_PL9?Ib+$uMmA428h}gb&$8ZnwyjL%(~Ih;V+CM?tYo@L9m%1g z*Cf;m6p!37*pGBm1vO??%h(DV(8;rRNE5W~5 zWv<5yO3AUZab8QMG*XBEo2+r(^kVXnxfJX+{Tx^hX96dY+k*>4#1=Gz{ElBok<3D} znuBTp?lFOJZ2f)`X{C*r5^v=5XL)JDx)<^8-G1{RKW?71m?|+W?@QHROg@HeKgt|Q z+g_scXgK|&e(vbJX7yUhU35DGh-1_FlhM2%573xR3A=%;hJ8Q)IFbUk{9TY|Vf`dZ zLx-d(pMp{qp2jl^2_pM5(0?6=LRABn{fu>{9jMVP0D3Da#CAyVcpb%(ds6f;j}t|( z|Ine&;|8x(_7przP1l_cj8k(bUXOS0VKcc0OhAc@yhTnnDjgZO2@m)>#nCc?LFeEj z1Kn!oBFYs67@-1y*3uH8E~gTwdilqTmlI8KggmYchCh(_?TbjW(Lhgg6$F5e5hw z>3%W4C9_|IU*Kp$xB#z6A{Gmrm&LZ$K^L+hO>EQQfUp1W8{8O%-#+c;wmZmcAi5ZI zQ>$JYKxVtNhY$KqxC3NKv0}AgL@OLaAdQ`tc+AE|1yT}efG_}JX><=1xq5+bszU>Q z7O|L%8YPJ!9*kts)I8>Tm5m8tmhcKuE>J!ozY7;xt~W$b71jun@l_x!t#hkaEVC#u ziKr_Z{6wd1iyVG&E&e!4@+r|ce$vg4k`(?*41{zUyhJ7G5Ba$!I-9mCI@ee`iIKPt zx_fY`CmimoAyuz}_!!}IsUvKtz(5gqX!L0>0({@QJ{)h6&%z`zxG+xH$K6`s@PHLCn3u0b zcI-9{ao}WQuN4?R>=mDyS^#Xl;^c`zs2@1+np2*mD}z|68ju#{4t#kS73_hL8@d3p z{PV_!Z?Dw_OFGDGXpV*eVUs~IU1WG?*L+YwfEl=I6D!DuMPmlzV0D0aVId*Zv3L{; zF+{_x=vBDuGSqUD+9Z*UWXbKAZ@NIm$%QBy)wtAT?gmA*6Dt_SQv9 z58*RtKH`UD;cW=`8ylFi0KmvMXe4Ea55+8)nkC2Kvlm}r3Ba8`>XS!o4o{FUTGj;^| zXNe5=rFu`=q>agX9Sv*>>BJ%MWqd!%QLrDx)*x4h_BNe}ptVA5==~KG&amTJo0!kT zJnlA?orm+>`8<9wyPpRy1b*~domVuH^R2=lPdl$d`ZT_@x}(@&3{zE2wIG}W*CnlB zMWI^9ve;JSW)BNY7!O6(OFe zd!eGI)$*3yYQUrTfJF!6a?*jOVxfmaZAh*3M(!-BOXIOdmI-j(m(Ym}O81h5UJO86T>rY;nmpBtkS z0@#wR4SgN^d*Qhh82j|uIp}4MojP*gi^+X2Cil;!_HBc|F=B^^tdg@s3oJ>VMmC>W z$zA-!YTH2Wt$RB)TFJpjSsh;NJB3grig)R}oia|k8TVSb1H#VCR$i)FaV)gZD}-^q zWzfl~AIF}ma!e;^q0dkZo8}2@VtiQ2x_INY!K3cMnwq7na*fV~Wgtk5E;s%&d*~D@ zmwVsVof-cw4<3Jc)uwj+gBzM=XJx6AE#yPTWl zIMZGFBw!7YCB&gQgrB9jQ|7cY10I7AUj8tro@_Tf3|ZewE!a7FZ@?+{BzfF8TE$ zX^0xKY}B$4t;uMPRuSMMf9rB-P|E`34MAKiH?8CCREq;iQYhU6>>ohV;c{uL3Pt|% zh;Mkp`9NZc8lqq}3+I#8p}?Km<4`k=9unsVM(D>}ETn4YfFVTI^Z_g(e1irY6D6Jl z#oR^nQ2q0=Y;){WP(M-GHk@QthRb|7E5SxV#8Kqzl)iWL?DL0!MGThm6)ugtpomi) zVP^zxfFd8bXAf}zXLry91_C_g7ZyWPS7Ju#)Pa6GGvwcrnC9|ar&y(omzBVMiq19S zYbD};h2H{yDVsihmKu%}6ID|dT}Q!N2)K8nFvcX$&ewU?8`UOeoAB9|^w!CvVL6OW>*MJVQg0Rtr? z@`=haz9=3} z@99nCHuSF7Uao@fF%F%Y5G#8Do?A>WyqmqyiEO}$&a4K0CD*Y%wWue;6tQ6p*bZdL zV~F?@3K@5t!=MK%qgx>j_%h--e~8P{nh{>73=vEmXx&sSekgz`|IC92e0>29We_h` zDWuWE!xdB?6h;CW>JUPv8+ZGFqKxx#R_7DEe1#X;X)Fml;@tkjk=n$!62|?0Z)R}t z)G6%-MGmXUz)u$+PJx=>UG^HMdUrRwT>TWk(fOKQ)8Egh&++n~c=>x?{(+bO!OK75 zLbp9Ift|w%kWdf$XTJUyUS8zoUwQdAUg)G(TII-2O3VVj!w>(?i?Hdr&O0r0WF=)PFHhW#0)pq7VV31>5(WIB=|=J4cg=XPGWmOI1|&Ou&| z@N$%wPcnmWJ10*weAk5wi3s;J9`akU-nXvq&bPLADa+>&BA+ddf5{ZD z_?OSfzifVYVNHH@zB9iv--2s4zdWC3{6ZU^Hs{+4cjEnxh5r0H+&kciS+ExhBm@PM z{3rt8h^OezE`v`KiP{E`j+nd?iE1W=PK0+Zz?Mp_1HV3A%4PVBx!#>IGseF{lX(JWNV?fA9PvIGnTOB0hrV2zYqc9{U2I4Je#wIb7Z+j zoB}bRPX#ntQ5L9AquHVNB7?9U-77=`hzL26kF*Q(9=3Tj5GV@aUy&0<&NR-T6m1fc z8PT&mSlTd8t+k;Ug9BfED#ylwi;Qo1IPvK6FjlqK)NVLe=?vpqihw-fv z^Fw0a#s1kc46EYi8U9FwEPkH@2RcU>_&ADz54zu(p-;l;gBMXukk;3~mmw2Gpw*SR zT>%0AR{%5kj)DY00a=i{iW98r&Y1INJVxe-Opn{~?xVy;!nP>Due=Ysya!l$B?4fS zf<;PChzszrEXsA6Qp*xxD3E2q=H-Az$?yM%M1hb0n<0_#7lI?CI07+r-ALHi` zMGN@70&w-|U@FffKTJi5cr^Hj)Twy8Cuy8sFWO1f~PZ*v4n4EI-=y!)jF?lWF9fX}hVaPpbKlZSkmYJ|eyc}I^ z9D2aZky&}@f#x2%8$Izw_K;ARX&P4NA;}5sNV&oUcBHo<0C_E$i&#~l0}HQrcm~aa z=QQjaops5 zFP@$Vqdo0hQ{x&+1Daaltt*=4;v|uMwhN@MX%{SA z$t-0!XhV8%E-!5Ws-DYG0R??MNWgoNH6}Yo??bZA2@XeI79R{Zk4IIwI~0B6ge16} zX>P-YpbgVt1-fpe6Oc7jCn<4j2J(Qt$bi=Km{E=${8QOF3r{ z4v+xBnjCa|Pq-xYFT$lJL~W~|O8Mp;nAYjBz7bYREwEDhf;sXze-RUM zKBqnJQca+U9}v>I!PrdZqPvRC&9k{e8_L#4h8n9mmvApxan9ln1PhK>)qsJZ(^~jL{N&H-cR$4%iwyS(K zrCPyCq}Vjs2I3UcF}p6Ia?b$Kpa;SEqNn8X%qSd`qVk17$(}xl&Fa8G7K(*Sgq+-t zmaz(9oNxaxoUZ)sf9Da)S)55c3)*WEM<#>PtW~{Mo~~o_m>sW!0v;&z;vf|U^P^>W zU4#Tn&KpFokFZc$Zg?G|4&Kw?6-TQzp8@Q=hO+?e)m9O(+}MEgWR~o{Sb+hk`tw}6 zYYXz?8Ll)~Q^{u_HRsBNuA#3{D$u7**JOBXnpDwY>p5ze=|xtz;FnV$c1mmnF)nnY zQV27Jmy`Cm4kb%Xh``|}W`ov<*nIAW%eJOI{OueIh*W0;VfiB{kp5eXpZgpxGw+(U zE`kiaDAqyRz4lumO;@RlXzxC>T24Htk={Er`1AexgtPyNM0NMv06}K~07GCQjMFIZ znUre5w8bjT>3cB?2Uz1zBp$+>*QOpeC0)!+B%NnjYF73~w*oWlgBjfuiC5#S=ZEoQ ze1KeDds#iD$zp<=-!OKu?&q}jjPg3X@bW;WID&Pw28ekdV_e`xp%~R@`792%Q_JX%^s#L`J+!g47^Gv{5ICIxy!ddCHoO5VW>#X6Bbm0w+?^0kC zar4;;?|}WAO2QVFGxqaEA(70?ZC99l>-$ z%TZr;0B^eOt=TU!{<&`lqK%y(lfqd@ z>7lHh(-xu&$)OfJ`v)NB)f@Fnf+LUh5y%B|1ag~tO7RSt}%D{U~;~I_i|p0>X-K$tIP3bfG5cK zZ^}4R#=d@mC&_G6+s0BjN#@ORrc82Zlf7oB3+QQ&7eW+Kj-HkQ*PPHHJZZa|SsWUgL19Iw2pE-4=-<&!# zpzc=pAmui7OuYj4?do229QPgSJ~fE@PC0poC(7uPXLg&DXKpbk&+IWL&)ll?$uqa9 zx8NM0M^XOmIPvCj(&jm+LxBx;5?U0q!fKcIieh=+mo3h`&Yw(3TnZs zgjzA8^5Z)$h>J;ZhB}LSv^sXWY{9l3a%!z%4r#`)mQC2BluqC~Z-~<5HZE4?W;U-1 z#TAgUqGn%rY$!>Y>QMs6gRRS>I1Dg6CQzs6!%w(^sg(P_v9T zA14%n2Dx4dN=-(lWGNGzrQ+Tm3M-FWKC3{30 zD#1i&sW}4@MIh^>a4-%L9ziO70MOq&V^%HE566SKvTAPA6?-k%EpT>$oYAtSC-8ui zB7mv=!)-)}mzFCOy6~Ro_&}^zZ-Kg00%tlfR3Ia^*e2I@lfFYjopN0!v6kZ~?nH5g zJgx9uR+$Ac9Nfig|9q#C!lc z>|UFeOS{w?^a?JFln&_gfjZrZ@>GZv1xGn`tUz8t78${k-ZivBh+SIl?A!l2c z2n$r8Pk^o$C2bO^e2(39h*#qjKEST2CJGg_ItUZ!N8Fa?6gLa5INQeb$~^ZrQa5_nmug+r8_S-M8!s@$ZrN z@qh$_L+8miHl00BA)=6F`Zb&ghUaw4y0Ew(U&0Vwp$mDEsR*BEF%z8yUS7}37ED3G zV9x6h^pQe(WNHyRiK%CZ55xp(InR7rF1Wy$U-&ajn!EI}z^$$zf3Wj0o56hn@)p$t zo&kna!?b=x8b)bkd8A9Ds8cZTz^Fim;?^{@DqshLV++cv4`u-qn0|rY zvm@b!)4N<~bweadhfem@6Iy}JeiIdw%)g)wvqfW^cN7{*8uk`cQRAe_Lg1>zm94h!_*0j8Yhh=VxPhe1zfvVo~~A7d=Izzf3k!8OO1Q zX2J%yL)#Hf=Rw?1(@+VDwQ8^BGSES(elu|K$$Z=?+9uy*&wG- z3mYETD`jdIVk4)QFbLYYuZB{%S!ZB%O&`E)O*P2LK!g_0`<(zSf;v!TcvLM^wjl}< zSz%;ZBnLX`Q1aEVBghk38v;j920v=Q6*NnqQ+w<@$PDr;i}U;Zr~U9h97J1s8|4$heIPqGgyk@(T?cghu@|@c!6i^g_ zMBw98u<&61g9Bv*ZFk`Tc5z%_5)hC<_yv|1Q zr~xPi)j=^}vXmx{R!U>@EQTkz@(uwIycP86(^~N&nis4r_%XyjrvgzedBgmz!cX-3 zK~E#cy9$h`cFz(W(Sz)SP`qc-d8>;)Q7z@^0(w(W zDolGhU8wVJ!XTF_$UO*yUTe^!&X4jNrM1`&^Tapf`V6g<0zb)mi8rP!VXZR*c!TT$ ziYEcb?T@8Va{d@vHcPlPbtgJ(_OEm@BBLRp+en?#-xU^D~PP(|@TKj^w zkfqahNs*|*cvQIgW@;V)&Y=x@>*dtw;tzTBkJSq=4JJmTKz2{(0HBETy_B zrM%qwo093vuEZ(1UZp0d#0`dJX$s8Wr@REFbhDjbb2x+qR=_8PUIKr0X^ykB#$2?c z=@`&roknNVJsy{AGz)NAH*ih=M?pU@i=|rqUGjJQ_F<0sxx(OQ8?ApX5svrIW{p?H z#M4iJ6SUy!S>#>S+Bs=VpWp|LMPtOwOXy%SwGBgm$4>LGYe&dLalRkR@=<6gd) zy_%=B+9B6-agxiuX=bVqdO=`jn|0lAF6Q1J4E6!|t#1aCkZaNH2B z-pjX3SU7o|aKRd>51mI3AL8k3BtYhymvq0KU=UE{a~mZfKD`9|rBl81<=*hu zfP{ppPL9OLv|GpNb^aGr&6kN9)qkxP8ZzmE&I55a3S03CKpRMHRQ5q29)+r*DyeqP zd6ZEC)*D9&iR+gMxi6Jyp1-;`m zaoQuxiC=E>`q~_huP2%lL_k39&|-A1xbOx;uosFGSE%jP@iV;^)Bd^Z2;ZP->2Rc9 zgClk9`j&QJ3B{k%NKq_RXW+<)2oCQEJjbjdBR*%5Faa{z^u(hQY= z;~%bkm?B4s#jtw-4ZUcO>mx~Qut1R2MNGg=k?-IlM$JU_y2SZ?khOv{*}QK>iQKy0 zxzt`YHg)~oX|OYuoFdDK-pX6&$f|`n5u#!4HL<_ZaNCp_tAtWndkjCYS-39g)-9dN z@e=_GjXVVWy4tyFH2YJ?H0UayZ(XgK{hwtWqvs{=V39D~2*;7|{CqS=3?iA!6w0_| zEUTA8(F0)0%mEI4!GgdffiyBtI)6hNuCJ)Wl z@2tetG#k|dQw_&4AB+SZ5ROB}zqG%~e+L`?dm z5|?+2TY#@^aFw~Gk<#^>$Rh6POSI}H-73U@QvK!IRppFo>KD9eXAR(GDm|aCcfieO zV!RW-W%xnG>6y%Y0Z%KQg`N)mXt^IlXr+X*xV~!kftlm{4rFz3zOB(F?JqE|MxH(t zP_NHNbA2{hd$GO>ezQ92t4DY zX_|}Vn08XYtu!2Y#wWB!B|m~lkfBgni)sq+CE|diJ>s=#wy;_b-rPhRuI<)9xuy&|4a@sybgfNBTaezyzfTNIBf@bSX(M1rK2s#M59>$gh&~P~{ z7;7Nm&|lZc*X7BLaKPD_S|bjHQdm$Z0by!75?YDaIN}i3@a=N?B*weu6*yL_V9DWf z(}tfcIs5T2i(}{D8Us^-Oq6F}hE2;>fMOD801i83YEj6~r3gFw5M3Ax&!Zq51V^J^ zDS4E&b`zfUC~^RO21ba~o4PPxcV=Z}c{6*D>jLdrgm2WeqWBSG4GKt#ok%!KT&gz< za36trwT_Lcr$$LG^ymgrdHrFSvclF+G+hRd(h0^dqpG^n1i~v;8p5}#RC*AGRc~X( zMb`oqUyeb~rJ70fX!H>_(f{M}br*helv8LzqEb-q$9Q0WlUYPjJXnPY6Do;HfG)xL}(=r&_asx#e=e?l)e?YA#Ap!ACK4wm-Ayu6ba<{P07!{J%hl*y0yy^~KmpGCC>N02i3 zyP7GuuBlItmPa+p4}c#<$jp=3cN&4{%&Wsd@##ct{$b9+?ih*?G6VG)BzgvB>h#GJ z&N=bWaeF6I=_9PFo}$>-VTyKU%@o~q#fra_*;yzC!1H0hcQ7%(fExero|j|@ zM&>2Fpkal?dN&4>V2C=nLUK;(6_PVF`BWOBjbM(-`svS7YQy`pG$*?8{>s=QA%B)) zPk?3of7>kmZNCp+u31V#s%e&{FiW>^mR{7h)<8c{U`mou2)s^!51WxmD^9y)=2q;{ zy7=r`Jbg77(hy^|I0|Iy2rS0u@t4>#O%QS(FMpY4GW}+dGT{=7HpqSHrPi!uzs0!} zR*mc5AF^s0WJDA*_tGbJYh+@#!AVoa)*34`LBY|^-~IH?=;S%_cOSuWH0vp#5IdZW`qZ!Fw}ti|sTe(t~FqR6tyf|()2djl>BN3-)S z^m_2tuYqlWtuQy&fVUQytKifRJoB7@PvJ|pkrVszhWEtoW zyB93&dA=#P$K2?NpWGDP6>z(p@x5J!v__auY<=ML69DSL13`suAV5MS$CC9l z!tmj}n(s5@Mm?D_M82N3OKB{B){G^poSrusRK4Tm6dvR0m>AO`|kUvR--r8ZU`i3xFFeFuwW z$O)vkeR+tH{TSmbt$;$EKdtH4ql-E%C%nfbIki#vK!;crQVVFY@vPm7J!6f*XA0b< zxV@rz7m*PMDsT9J?Vr+ek5JPQA|HB%g8mt$<&NEN&)6f=;^mLkMT@pUORo%}CmT0X zQ}%#m-4`^TQji+#S8AhC3CS>=5wW0h#8Wb4KPJOaGOm3Yq6+dC&EbAHJDjv3#*J#< zAy&U`Mv=5BEJ7zCi0O~&;O*FX8#M6xDP4!sgRl3a^$by0I4e90OL`S83b~31UgyT4 zWahr^fB^zs>>bQ^knLq&qM85~OQ-FazzO*=6X|Z9m1IvP0iU}d`D|~>#H3*4rs^T7 zjdMe=j=`vL7Um108m(eL7AjAm{8O~iaHpX3I6WoOEzuT6zZ-}8=mr7|buuA3gbdjS zO{3h&*U>u2QAI8~u3y)K-X4#N?I6m5Rx^&S(<-GvrNJoUlV4L&^^Io8GxN0jN^>Y) zczz*j54&-;6?4YSEWy#%C}t5Y}1=A_E{M>i{BZ0yo*C3~1H! z`!)854lf#XEC#|XgW$q`Vh>SWc*>m}sfh-A7v~)W@YHK%TgGZQB99M26{7WnL5ScK zQ{23-c*&}AR+*d!s08iTMRHR$(N4pSLgLt@HTwAiS|d)$J#B_$7+Rwk5_h^%H_Fb) zK2|(Rh$@jpD_R0>fm_hYDJWI2V&SMnV@02rRwV%lHjisG5k5z<##E2EX=tiykn9v~ z{kYCSYG~%<5$RMVd zEXUK1W+@7*BZ9>)%1Fe?gZYk(I!ogH2+2 zn#RcN90O9S8ij!nBMAlq2H-@b`&B{3&M2**%zEh?dtpWCgO68!Al8)iEMl7$(F8b+ z$u?}Guwi;ais*738Gm^Me? zdSxq(;l&yZ6P2$HR4SnzOAkxH0z=C+6bQ2+%$y)U7HQUIZH+)xd#yKpq^d9#=X)a! z(Hh>S6dj9mb*fSxDc6Ddi7<$W&?(TRpvPWLW+;cSm}rwiRDrIqk-4EegAaT?{bY2BR`dwpj3HELS}cTydD?q4OYkB1f{I z|DZe%as~^xP*p*$hCYfKPiTZoYdwgRur3G;n6p<=y`_BoN*684b9Rw}zd_0z>xTg6 zbY~#lEQ^9aoJM;-g2Wl$j9O3#P@NcgP;pXvBFIqd(EGvt(Q|ZhB#Jf*)~gWn^-W#E zVim))diNgqD$u1~bevI#y8Pg^p%8I$>u0)XxD-5+pS!%4iBG0N$k1 zQD|&h@4}2MlpsYm_gWBT>GehIiE%bU+;+LU#J^$ua4K2ga)|FD4n?^3TroL`89mSM zq^+8tTSTGnh;I*#`7Wd)gjGSMWuH0N+oAVCf5`RdNnGG`Bk+Eql}DbCx8ZEoQa+K| zc3=r{dU@gI(pw1y{NWl-ViWg?+IlS?3SzyyUt#B`S=^5^;m4VK3Tx}D_$u6b$-<}o zh3J0Y%w`Z5hw`&MN%a7uuMy`D3FvGlORpPmP|e1A!hghL4dq76v-i=#HQjZab!Db;-qPs zcw2wcG~TtF>?Z3^nq;?WHkP)i!*xqD6O+K46&8F?H+uiK<_dn;Jd+*Eu zB=ty|g2ct0JLjJF`M)0^Lh@5_PXtdQa`J5-$xK0lSQhlpf&9dgF85#ksVkpXoX&II ziwlS^a_73R63AUGVNZe02FP*%D+F>;$u;r~2}9N_llsu&ehN)~(djPvJ}+d7$;-GRev7p9$F&NC?)^Z(i#$r{<|fj(otUaBl`T& zxYmmwHCu#-^Ii49a|85m56GEl`;Co^WQfoA8+so0=((5lti!JkI~xxrV8!?Q6HIQ{ zVaEmb+RibuKAlIXKMTs_e7;1h?}zmR4J%@>5sZmvR;V%flsOeWp4N*08yHgOoTbek zv#3;i7`r)m6G1>2OQQ(lgj=EB$!mmOJglaxDOh5GX`uivlxmE`VwE`Bb8KPEbrgb| zcm|k~qmIoI=abhKISljV3!p~ha%Kts70|T*?t(zLp8z*zI*RL<q-1FwP0Ti(GwFg9O^X2PopS09y>gwj>*k$p#^qeX5812Lbs})AJ@cKX>6-o0UUi^9@{!j zb=&PhDwv6Tq0=j_Cz&LOVH|BCP{KE=?`GyC^TNye$vm+tGEd@;TG^J;@ppa^I=&Z| zDV1CeHz?#*@dkxLoi|lwDD5^zsN2w+>{BGYG;!(_*?EQGqJOE&bzOwoTqy6a>h2H0 z1kN1E3|WM1B14R3lVtMK-=*Bd+7wP3NFYbE&!20D-oB(Nh2xq7Ks!5H2Nuwa2r=o# zAN=TNDJRc-GX4@U-0-1&0)}-&iUY}J{g80t(=^d_w=f|X(XvV^5UgVjWq35g?|>N} zDLAZ3DNC7xN)4dqlf4S%ds+pVNh3kUo#7t8Nu#8oL|I0zZkdC0UH!2uXM{Y33_+VG zUhEN12ujQ;v@_Cp3#Bc65$22$QRDMs_Fv+``@V9E2F1(Q|u7{%mSM zoXeX9tbp&5k*lk-(xZ@7rh_8t?`u3)GD&&`w^;`PlW7~5F}aPIU6WAh?+1=^aBe92 zwG79Js?T$rm@S(1O<(y`PYR{&zk*!T@D`-MxTIv7mT|G>q4zaTFcs_SuugCob}+yJ zbga6=mNnq-qnn(H@ZRx(2|ZN}oSt4ZIoRYiXsd-9knOw!S~MLze`3l%&F)~`F65f6 zPrXGlX-uc@TiX8_WN95WC%F`#rRWQe^=RpY=km$``v{|(*gW5GId}{9Tl9dyvETU# z|0iU|5eY8St^gg-6dNqY|9rUupFfX3I_Z*eOTtGhDxH*9fk+gby?N#8Vsvgt zIxg2y=!SZ0iry)_5DwNXzt3~7wIioWM`&$d(%NCQ_DtN`ao5_@SDo1RIIZ!@N7Pyv zp@Hn_sh~5FzJ$YviVP?xt?g-uZ)8$HmQU4zPi?9 zA=*;_$ZrIc3$zdOE9=uDp9y4*;v6@Ho>nu$mQe>8q1dA!BRtB7t7MfjlL)asGWJIM z=~DI@OqFTnw*ymqOp1rGQuL_7RQ$6{iYJ)b^Jb!M8$Y3Q?nHnFB~ttc5aMlN5bz~*v8-0(5JJbo zO=oDb1xP(x#_$Q{R6|S)V9$~Lo~{Otk}sng&ANEb3WZ203Csu0AleD z^fX;Gqp4FvGuA)`fbFpQmATuI$UCf(n*dI6bwE5#i6^Q@4=aWPsAi#bFtUJg;qxK1 zdbmu6&(ACped3_=oZT@94ZOSnYGbybhSjsVFkw^sH*-l9nWKFVru|)ZiYfz2Tu&ojSZ$ zt!~1HP`N$nP`{N<1-Rg-$b4EyMwwD{v?lsftXwf(|K|F(wIk!SCb!ni3rn{m>6XL) zy)^VS9XYe69FhmeonT_ecKIB%K{RRg1|EweVBlzyzqJEg6v(O$2NR7r!+eG7wP#@A z+8!AiVnbpA$c@-IIq@MU3d#saD&9S9yw5~$8QZ4>=N^;Tbj?TmUS%8(zq4fRvO*@ zBwBK7GvhmNU#GTfN4hxEiqeI>FlLXm6SwJN?d#^A6fSB!Jc)Rb08o&cClzNk4qOME zks&@w*&PR&AzPh~Rk!5z7zkKWhbgwRk)&T`<2bqgWmdgeBx|k2m+W5MSz_7d&~b|h z`JDSIV!H;cu$}`hXMyG1wA( zFr1_ICD`I~wM;Gt(Co6gb-liz+2va>G&UjVL$-`bZs zQ2_#Nl>JH$$>Va*!XLzV6=&@3%HSsKO&pCXiGwIuv(kK)0NMmUz5^>@hl%x#Vd&4f z=T=JhdZU{pcdyiY6vae2MD1CgXWvuLyJxTax-nI?Qi5&^->#m7dVj+{(W15T8%y2h z-i>9>QtmPM?uEPRsNzHe=nX7Jbw_FBp77uc!+cwC6vFi!_Q*(VP5C$owSYA>Pso5~ zPwwVP(Vk#CZ5gF=xGwM37+gMSRDe%Yrr*8Ar_XwqCMB^demBxro_#MZFhcI?uXp2J zXSpet^Tc;8zK&_`Qf`EvrJfhvJtgiAZ~nyVa2fPG^@dU@0(6GTf5;*Rc+n1bi1O^| z7_qK!tu+&wf=XS)jBL+Ip^Xvd*0|NR3d9e|b)J0X+1{XtoYK`qKe3%g7zg7a9f zorNfL9Cx|2d%Hwor>lw8U;PqP7D`GiKcterk-#tsw1Ve+V01@b$nr)O2`B!Nk~123Oy5 zI^QZLU7zq~E*Z$?aIj5qPQWq=f;< ziVB{F$@23&9;P4!1hp7lG7(Nf$DB>gYEPEf#KBW8qo`aX8t*}WATrq>ysM>b^x`oK-7`LRAN-;&6F!`Kt+DfFUeqh$ zjR#xb$k2)6Viu~Wor2xWwi{2?s_;F?0CZfP`MNW+MX3Wb0lSMtp0j=N5|P!|s?M%B zRl4!O4V&Dl8aM|#CxY|}RF;Iyk~A1s0=ZP)g?pudET1+5Zk5s)hLC6aYfdL|gqZH= zUA%@BYWD)p*z1(YAr3Noh~4DaW8-g4l>TpN@g-qlp;LKtjN}>*W+n&np9PwkNyJ*M zbrS13a4MIm1$Sf3TC|({=nh?ePZyEL&4CY>=Py-_LUSyN4_hNrxw!^diil8rESY=| zy~H0#u15vxH6)$7?1rHch>)}XZPO_B@uX`+Ae`om`Fl6bWQi zUQoAVVJ-|&Md)}fjp>Z$(fp!eM6fiI@4zZ?9l7z#O#UD5u)#`6E zqt%h??ZjwB67a4z&4n4_oI~laKxdA$?sOIIJl$`d&wcvFd~Ry0|AzCqI+k!@Gc(_@ z!qm6%S5~_7+`p|`eeWt;{pFRm`jP0bZHwP^gDuWPU(rN=@@6O6N_U>HMJ;CcmALU1j#))@?qy$~M1$rEM;g&A+ydE`8Q&u$+yKR%T}AAFMFf zZ4kvuzf&9isT*(f)HMI+u+eQgzqG>Sw{LVe`;bBQqrZV*lHnPoixIIC-HrXLY}Hp+ z+N$tddl#;zHY-HeX6oh7=lRnj?nWv|AR(zSW@i40hF}y|zST%BDU{hZq2qT`v&1rF z)K(liPw~l&;yT-*A}MOFJVfy@qT^>U{>8P`?4-=VER&f>MrLNhj8h8KIX*r{R8?zF zI5lDir3!r6)5iTXvT0##stQ&wKhU5R)v91c_R79 z*RcJQ*W`qd3W<(PAdD*8heaG>QU4(rp;rjVH?9HZ8=@9 zhknFqClTLByG+`o3v5g&rDQPH;;g#-KFtK~KH_ebUNtCsl>t!ZjGO?$$ z9fyDr&DEdmU{2-(D<9Be4GR@i-L>Bi$FsL}+;Nf4;}#ocd24|zb`XoqdFUjTY!>d- zhOP*(W~|TPE!(UmB9A?W67@W@L>_RZTE{2c3t~cztrLdpk~7+r&$%XKLE=75E&qu& zd!D7eiaMSPGb<&(%Gkq`iP5N5CV0Tg`t*`Sj%3a=StZg3WtFkF$zsQGOS-=u<$R4e z^*9N5o6(e~yDX<)Wj9Cy6*$mzb#=n>KYjbL%q>k8-SmvWR$0AxCz-9(5?VS_GP9A;3OG4OM$fr{q;g1E5|fGOVX2Vkdd~H^$jU@o z3#l2v*aCf0+gb%~_OmQ~$xdIuT27BR0y zE;XSOhe)ups1@=DJyaHhj`zi<)h`gn&=!qj{wk<=F*fc-03?kA%jhbXJkV?>Lw(i> zOD+~$O(&}m3I#Ku@I=Q&FMuk8$a*|&T9KIP#6>g45o0u2o+~}LHS}!jgQfY}xw#5b z*e%Ww!iuD<9#m0V2X?qw9G^X2zdB!?bi;hx8prO!bt0w6-qQnl>QcBkt-Yw>jW&ro*m`GQul=dL~icFAh~XOF0gY? z5l?Ie#@;X*41QVOk-^LK|#Y0 z>GGT|7M=Gs?tGv}AaY+SLHZEj)Wu6RkSZ_E zR+Q25M&_hz=1ijLsO!jr*jmm%B42ZoF*ZzQto$j+qIY7_j$6t|Y`a&_78yquxuNr0 zn+Jgqiz86Y0{1dDz%7)gS2xD=tteNcT0L2N>3oNGAR*540Gh6tZ?F{}pUCDTNuY@u&U!+RmQT)>aPli%x!Nc__THVT(S_Sb7-yY0M-Ss(W?`Bh2r4BwN`E&Ax|bAL~%EeI!iX&5dN&F3ryFY^Ap}7G7={ z%&v#B)vYj^U5}{gN3&&bt?5VFnx?w2Nv0F#1l!olXo1DBum;4Cs9c(5*3j39u8FBD z+s)pqs-|d7E?H9cG3q$bdT4||Mb3p6VqBOU*RL#8!&Cs9Ku!nvTI4+0L?{>D=jr+2 zi!gcZa%I_+sg8s&emix@;J}z=YO#GAaZhw5?$#MKs7OGEfBemH4lM|zf z=9KZ-?7qh0bB@>Jmlv= z3#wW_`n!T$K}t?JM6J-!m-uQj)lkcTkegR8tk{ywtR3%IVPJ}s0EOLJ_g74$pTqSjfVzw^#5FTT99-BD)&z?+j6(}0jr-x-N7MH5zT&zu( z=!ExS^kh4ysPw#_=Y6uLFO$ZCC{(?3h3Jg=ul1&)Q1!mr>;2a(0#)NT!yK;~e#*x@ zax&Lb;sSvt`YRBV(BDW$%i*!X-+*hzQ(+HX8E>L8kw8U*mM&nFwE+Of1db(_;jMhD z1o&p>iOT{a%m@sUE;PF%LYFo3dLjA()7;Ff4mnHvz@hi@Ffzx*f(gu<>(rRE^we4D-7gUq*%dHLt}@M>D>f;l0d> z=;3w!)}G}Oj2uSg|8TB&p`^_6*hQKs;2bMxB?$N&J<47%0RYc>VY?Jo9cxE#A_H*r z+@S{F%)dfUqOWoreM2MdMZ8#z;?ph$k>g;YRZXg7#wOSkR4>lVoY5d9Z|s6O+{`aB z+7|ZE70iq(oO8WtW62FVpq+s;9a+6t~sOp2y4Z`x`ifH_OP zQ#?=3pPh{$-D-I6P#Z?n8MNWV2?}gyzCZ}?u~)_5)%o71-0WZqLw7m9Ks(sKbdXdM zz|+Wa3rYh~CYn#(jC*Ygh6G_*k7bUC=oB87PzKnCC$0T_OW3n)u+eMSz@LR!b_W+%$V=Y%L=?oY$6rfVLh+b#z%MUOtZNh zB*Dz-15*S@H&81I$sEOf#PsGsGEY{v1*sY&TGD1T=rWWu7w~p_G~a=5b#IwPT4g^X znl|ujCtl`f3EZsb2%xO+_7>@Jt`Bi2USuXjB@r`l^I_aUu1zeT)4NqcqW zi%Z@62yFGz=Lu&;R1nmjCy5_PjO_~0wl=?1jIJyV43ZXvxY`4xj)H2r`0Ua^?bVCV zR`PReNXSJ9tkVR)Qk_@#5Sx3Dyuyklsf1iZgtsEH#~Zoj!KF34KS-NXf!RO9=!WX+===X!DK6wH{ma9Z{L;X=0(R;cv*GQLq0+xnlOo^Cjvn!(#*>CLm5COu5oZ%(4F*l1R ziCxmaG^DUzBuGa(<6Ys(K|O%b;5jfk2u zu9wkSXVq=z7Ag{67oJj_qqyTLh9RLk6>+SVoxUX8GH{3!XpZ4=a9@{0b4Tfe2H8Zp zz{g!JT}H%NUko*JWMfd50#E^blr3h7K`_h29eXV%^iJvK0F;CSsmh!uZ#4~488f2* zHc2#ZAk@u;8c$D6==wVYwir+RlWr;26J+4y*p@MiKHUOeiD`LOalN&A=TBBEQX0le z46n*`BT5>uCf#`7=b)@?*ad14OB+WYcL1Ug43L(G2tE@Va^I!%7r5;NzRAWZ?XU$2 zmX&}E9>4@ikc0R;QPZYvU0|cpYnXDaMB<$7rUo&H8A&LRD>_xH-oK%$lVO2adJkRc%sG*tB9ZVJPo!cAwq>%8!1 zJo*jF?-^~j#f2U2>o}Kps7sr`^$(n#s$vJg#MWngY-}u3T5oJYdL&_$W}wBpM_=m) zoZjKJ;2*HkYuh`&cWQnS$)y?S)Mn4ZLlHM{R`N9S)NX6&(H%Q?S9d?u_Iyj+-J7p! zS9SZY-E9>yDOt&_ZT<1l<1U5$s5XY1R;56%&a;0<57?H$y+7Hfny5E3`#={!e=w?O z>mHMMqV3@p=vYLIKr&1Zj8v_hJx$~Y&;5?=XkX{;J322%eNl2-au{@a>7gCF9^SF* zk@vQBfJq}BOX{$=2(6iNw=|EMKK(ejvnS=}#lsuy(bj>zz=M~vE3+kWXX&(E+qUWp zdeT2(GA;MiUUxEa-jFp+ z-3f#3ke8b>D7Yx@G1nTuX807-9BgG`Q;pDuAwYzz%q4O6r^o zx5bEQJQ_8A7`dK%?L~{!=IAc3>2i(o#Y5K5S|?p94u+{escfO>4Qh6_LL?zrfe}RmYRi8TY^cAl&qjxK#LQdy+Ftd#bU7; zjc(Vs-=IMkk zNE7ICyCZk7{oRPB$T_ZU zXfqLwo15sy@{j+RY@t4xcE8<`1W@)Ikw0Hqf!^t83nI#CZ0wG-rsn*4O>bR;lgOB0 zR3cwyT_mUI6+MSB_Zd88W)pozAI<3X$94BHJ^TB*BSA!0^pAA0B=#0|{HOKN(m}&A zce&iXzo5Hc)oZ`3yZ^yH>S7t5q@#)cXMMB`Pya%97UR{zyZ*L5{*Er%Gzc;e?|pve z;MBB*2(oBCv z(xXdWmtI{8y7cK%)WtM|!@861Es|c$1+0~#C0eh`W?kN;%U!y>TbGh9_vm70VHbDJ zA*7H>FEdN*8|0S3){zrxVrogKElLdO(Yk8i&nLgPa)WCJZy(rH+*BMMxNBfT@&4jK z@m<9s{tXWF6!Qbm77NAVx(&n^+_>%zg_`BrrhIO&*LLCP!0zE^iVqBK8s1nODGu7d zeZ?Ms=ROw(ZY%Z``|aPR;=sTJ-}e-Ii#>ydfsw(Yed5W$ZL{<${Pg&{T8Wz^S@H>& zJ(XY$uN6<^{}zJO6N*NjkG4_Fn@sIJDQrF~Z)*gSNo4qC2{~<+6hMz~nbMYtawKjT z!q8wX1?OcZx?cO$CO22tOpW2?<~fqLE2nlhvR%pSd&p_p9lgPJK(cqI)=8bSyqi4# zJooXc1m%H!xrqR5vGR3zT8YR*vQU&0pH&?{q{|QMVyEsWboa1Y=)B-+_cqn4Gg0ix zcfX}6RtA8E(?#vY4IQHg32Nx3{1o6U%kzkC6gL6UtrNd=p1OOfCz-nIXp&8#>p~0X zE3$;^jg#f6O@L0p&7;*>9b)oFdVCIHBaLT1=0eTVm}?{9T-)tPtQ zcyhN=Y^D8M=|kjMc&+8`F4?8d zaAN38V}0BSlU2&QSs1Tx<)dcEXqEG(Il5mBNR_SgHrUts#NG0y5b0C?P5N*9!hnMW zMb#_7IRsp`W~DN=;<4qDBN^Q>w0GL&D?U=&_!tJgXIfL2xMv}2iG55=X>a)Isl~;& zRzt{`5)6`34A!XXc9Gp|YzKhmijPWEmc-G)<^=G*%?y(cU7Mr;;ZqDlXbgMk($#sHf+W>0^s9(vYX%<4O}N+9%M|L+wGX%|EgDPGe*DyfNZX67 zuKr4QXxQa7ZnEcBrtD;gG!3=@Zd^zeBN zBf~JG}wH4Bt%&fEPdOK!Cm#?(3dqK&4+!#&#%ZS;3 zelE=)sAN!ed;)2drEl~>>nuQ8BR_gyZM4xJSmXl}8yr|MnqDBi*=sXtf%%(+X9S5H zsxCB#EqcabeUy(z^!pS|x%(@mT4ZR!$Q;wD8GI5{NFfMsYqiGeJ#H$D&PaGt$M;Se zallGcw=(96mX@7@88EN&!wwi^1>p7V)FRMDK3Obxhy*1Y1i1+2YWJgW6G$`L6rLM+ z(;Ce6NK2!2wr9O5kQayXC`9iO%72uLMFb@Nq8R$<5j}kqAo0T*a*QB1GswpJcz|yg zVALu<5&$DnG6%ENp6C<()DCe;W6Ns3lG_B0R~i0WU8lMYTlSwQRMu9Cm45JMpFOpZ zR40nn{>orw=rvS!Ck70kt^uE}i=_B0zsRw=HP9(FL>cckg9=hCC2Sg+&=T?!xvMs05)VZeNoG8J8=g31OtCjseoL7xgLPkbgEldiK;Pk&=wQvb{@3 z5(a(p+Su7sICB!>%5L{ARF0tUILI@v|59BZ;AHAT$V|>p37>9%< z6<}+vjbDA@iQN-p&K7kqrluEAWz;Vdj2d&;MZDM0DFF&(bjB-K4_q=Y8TFRfg=SzT z7@`5i^W*?bY92`Oxlq@^C!($iMLY;XycXuv%SA3PULu+_-Z{?N&E8ZZ9#BK@(@QL= zN+SQu(&WJa&xD7xp(S7hK38sOw4TyGRsxENP>JmVF}3uhF7M;g89!bW z6u+N-2|p@1n=oUHBVAY}=R4^mAg}Xtbt7C^pieAeSF~i9&*MWy7FV8Z;YIN0pD*QN z3TTdCSLb?bhdiDn>{Te)i^Cr!4bRT$`$}$e+qcxnJ6sFGw+pYRoZ;y{Ye#rG2cG`> zY!$+x&XL&$dy@9{e=XfU<xywQyB4UPCp3|0Ld z^;L7zm2cb~_p@_ROxI1oI@pove26L{nus_(`iy=dm8|ld4*~>*<=TH(P?5b)~#AQJA03Elbk(Z7I~b_w#`th#A_Zo z_R80OuGf%b!BAb#R3oo=h$-eQ7Wrs_oybR!r#a}tH#k}(3Wz5@yTTsrXIC5dr?d$j zgE3-B%NmqE$K%F|18pLuz&T0Qn?Amkq8(ra0I&6*$XEI+g-TyW z(l`*wJk7L(w2%v#usCAGIn#4Oyp43p~a#MOc=?aSEC&y~J%*te(*xL7JqUh|CV6T7e$ zZI1+uU5cv(iHJAJr0!WV;bO)wDT#e+gS5*u7&*q>KDnXSjVor5?E#0=W7|QYaNket z6S11HxAZg};>37yJ#=ywO_$6;1D%i(8zeo}028xby?tR(k#LYq&Wa%%a^zcxOT13<}~K8uh;4XE1qvl~cUl|}Qh$#O!U#OonDwq)|KI$=e_j61PM ztZtL>s+m`(dX0e!YoNH$(s|lIRu%jE;2+7}8Xw&|J<0!P_U@g2=9#@IdlD7Rk~*Q} z^H$Q4I^!>lWuA|{w5@b)EE&Vtp3)01y!R!Zj>WU2N6AZScI>58!uie(Kd&yP8xHb| zly0D<*3!7i+3;Us6?Vy3&}}q=wFJ|wRgIapq$k!bf5}BqSz%_}9JbGl8)S!>xtWOx z4R3MoeQurIanwO@rF;BGGd2`L8g~^w|$sx>)|sl&GZjW3|V^_xYF~uTvBk%;csqf*hrN=YrRVX zmq4nZnif-U8=_f^!AEl-wLtw&91hKne}vEyok-7+RS+_(QLDaLd`yp^E#=W|5!^qPDi>h-zpL`NTM^D zb`^4?d{)G9R7*USITxSt8BHyEifpopc#AxRHuA3p(rGiKQ~#{G7XK9dP3|j5gIah;*{1hys;S-)RJzMkdP=u z%wrjzBc?Bc$R78jx)%`a^WN=tQaz31DF{{OB={~Zrd-<3N&ykbDJS^{O$Oye#~NHx z&BaQ}4!u?y$L>82WNAb3G~PeMAOg|vHk#!#w8~g5NWVrG{G+LmvzQhDzyiN9tX*xZa}}|^dJ+;2hmcK3kqO4 z5Yb|w%~pN}hzF<1k#1@yIH6iL%=zBunEfbnBN6Magu@v9;`U z_HH*hGkTe`IME)RLQiEf7WpqRBx$UYo;cGmsj!vIBt=LO)`XnVr(I}O$U2d-+RWCd z_MeX|6ROf4@T9n#@KDmvkDN)#^;- zA9+OF6PjJzp$IO4*CU>S?9%h|5D(rXC)|7vZ zQZd_>Nh2ilCQ7sdv3p9|6&zAO2}`Vft~DGV-ATN&haY+LJ&(N?kuW>Mo;n!9m)m)o z(Ajn-U@NG~_rZ`HjH`EQ@+qR-2JM{jIn?3H-cqLL@bZ?@8RQbq%~F^k-e1y*`*_rG zpX@7tWVR=6R`L6#Od3zhY1?UEJ}|aD^nZUuI22;R;yT^sY08fTuoYa6|)!L1+ zGazEO1+_VU_KJ>na;%d{b=CP^j2`^(^M@w)9Zqq#sg|{0Jiwx|m3EFcU4lNyJQQk} zt-Uhi@UL&qya#MI+B*RcK0zu|*TX5JD1x?JiztY}{=F6I1pZ5npU&KsxHht}Qcy^9O$jDyk>>Jy)Y!+q~L8Hx7e z;9oe`6@3{-t3~irOvJTa6bz-*z{lC`K z59=y$9y9CVNzlVr3zfPI=3{b0@$aggi_ypcD zN!RrFX@UoVWS@Nd`V<`!e`J=op)2oAx{`2njT1f#mLot&wg^WyU6#+hmjXkI-=s=+JAgqN)|cnnpK8+qk8 z-|w;dUD2j|nJ(bQZ5~gE`9H7Pr_|U{E^w-67sRe!Y4#e;A5H5kt(n(q@W)or7Eju{ zhqZXq+(;^s$1Xs>viguW$RPT>0a9a$WflACu2_H&8&|fHh1^cw+JG`3#~T}RIhfmZ z_N(wEs0fCH7Q@a=3@K?ek!tK?fSk3i$P&>bKLFYhD1^XYwQ+@dG6e_LJ(3y_3@k5; z9-a}_ATkj({J?RB}tbo7Lwvl>F~2Jtk!tjK0QmLDH|K-u;^Y zb_h6gH_$VGPN6+CD&$x)Tv?)p&ve)BbnjXzHy(Q)-EHp^c7#wZt#e_uIO&V#VFGDN z#Kaz$wqrOk9BJ#c7>+i3aJ6jqo{knTU2q%c4|&CQPjpV#%Oi%@_s|9(DdzNe0XfQfm*twK|up!)a7&5t@21 zIvaJM+yQZxGjE1#3-b4QtqV|%mW|&6;;@%-T(Qp}1pO@p1e0G_NBkN8ouM2dy1Xq% z=nxZUojI-!-OELCyX#o4D8nDQ{qT{I3{6rs_A|d;iup&KfI#s>VcOwOCOY$V*9Jn zEA#^)giVmE≷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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/re-vendor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72315c9242751594f72fd8cfaddcd6e2b24a0eeb GIT binary patch literal 1053 zcmYjP&1xGl5SFysAO9xMv^0=|>8UO_J|v`2N-4BwQz#{{B`ljrakN>lH-PpleTgg`PSiH%@lZH=~g>n(rI!bvn&o@$WPY2>C-Ed@v_(VVEBPf(TlY zbY*Eu{hX!D+aL|R2#d&LER!W&(zGF%2)>ZCDYyv1wnQXiux;59$vM;CWmnQ- zV@XBhJkYglE(s+V5zTEPLfG+DwlG%htfMhRzsa_bMynHoekA?YE!0XzCx~|+1LqwK z^8~;Gk0qtV(t-(wo*-~87%iTCGWl4(>S;N+l$Dt3-TJEc`J|M2b-fB4-BQTV4_sJl zRaqC9E91DFEBlk^2$nqj-5=UXJ*-tdIG(9e4EFczMe)+?VaShcm2UX(CKt}|`Ucj? z0SHZ~PQb3IAPrpcR6c++Kd_{r7D&7&N6&A7S`if7vTL$rH`LF0nNi7|(b9?4^F;$fdmBEF`oXxB%U8E;g zOX;FnRjTT|&m23gTnt;Pd?N3~(J>V6La%BET+;*~bdz>zn|7Jrg4voes*SRG#s}a) z)l^WyEIcT|$00JB@7SOS1o)sr7gXRy2nrzA-r=gb(a6QBGBz*E1shlxdeQvfV>`Et z=8Ii99uHJ?I_*a;fHpZk$yKFWaHr$ra(b*cz}1@oeX1X!zwY;nQnbqV7?un!5xNDe z^fq`d$udlrWw+QvjnLoJ*lLXp)%Y&;Qv`oY8$1{1#|Gv0mtlreRmv>$CHZ&ZrCR4l zm9xwRrK}v!_4x8ZeZEq!d-8fR6|+*lL1j%3Ac1G*f40REo+L?_Kr12`XcP7iI)doX literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfaee18ec472e3b644af25c4c76bee7bb871be98 GIT binary patch literal 8042 zcmcgx-H#hr6`wELW3Tr!o9|GjX-RREY*JEE2x&J08-(BzhKk{K3*CmBp!GwNac6V9gppex9tPM z*1dP;+^_R>&pC7Mnd#}$+l4=@{Og#e{Y@MBS$MvP5;jo@P3TQ+g<7Mjw~Q4-S1@zM z@uh|5| zA{HdZ`UWJZ*M6bBcji>o>YVD-J11AW^`B6;_`=v;?2gJoT93T zs-i1EiN;KgEOiuskl3af`>fuf-S?c#=ld`*z8Z1{q*l2U2C`xGaVoH?J7R0oe zL2HXyF^9G&=EVZqlGq~_(N2lIVjtSF*e?#CofZehA+$4W#g4F~mM>Qqus8jvr87k( zEJH72n9g-u!srD?Y{r_a#W13P+$Rh`EI{-)$B@&)1SAKD5$755xUc}p17gMnhFs+_ z1wgFWW=M_4*ns5XB11NLl)qWp6Tn`YQ7W*6l@<5|p{368~J|GNDhU6$DRkYga+W`c5r z5wYGk=nW164r5J!UC~~|__KF(-f50kCHeskpJBSG|HZU_p8JV*>TfX3)PFPWU*LYC zoBH2ida3{WY5yMXpHuzv=kXlySp?n&AcXht;68LHiNbp^#oJ)K7vpj|>aXC*Ud-GV z5zPr|VGQ&Yav1DwIckS4|2D|2M=$;kAL7d2hG0Rq{arzb8kmQJ$`A@lA< zk>Bb>Aq9<8mg>z#dmV8mUw9@Hb(9h#Q&O|P{oybB|c z!4l-{yr!7vmRv#?7?!pJtk0-yol+Xdl|uBj~$MlTrTvQj+_yYbvG@)(p`*i2f~<|AAy$-sUL( zNirKAWII_hk{H7~qtz;hk^?Tw5v#bVI=Ml&wd%`ccG$z}l}x#6;rga8k~#GvJwyjB zw^a{zLcC3^%@gWDRr(ZWAuhw3o{W+s6MC{?gI?%wJD_P^(`|K|QN7cw126m8OE0eTqzzJ$OK@>b3*d->mu_3Q3c4 z;NJvp>5#eM5b1~D0A#|UP&T2mkXWJLtjQ%vQ$B(!*}t1SXR;1OW~wGE%~=-Ih%mKx_Bh#(hv=2#~-TA09=*$kHQVP>2SNs(zIl}B(o(EdabG1P-W z)N+`ZMe%cLtOnNb96;gosI=Jy{hq&N>9$@rRI!bcK4+G#l3oIAaio;=w9iDJk*5(x z-ssKWWB#h-KfJQ_V8I6zapfReqe5WScEvA?enn*6AO;p}Lq*8tn&+L#Zpm#D_+8@?YnzE{1j5GCdv z#R92{?24j1jX^&c!EP~Q-iUb|Ly**(`9>cM^vwk%N$6(ZU{s$TpsLKyZn*Ms9$F>` z4#ydT!T(uFUX4f!)YgMYK7dW-gQz}~vWGF~M<@fe*qc$7?#fcmNFyzv!lcm##CsHk zZ9+ewEo%EUN?-_MU6YP5R5GJt_I}2>2ufz8bO*>@q>hnN5#y3l=bh!0p6L@f<#3&p z+wfFggVthBWb0%Ombo+vc2>70jLk-5xN%g=nv0;~6QE8a`J~|^kPOIBJHT&tNIQ?% zr!eX#C?S2#Yq>>OOiS+#Ekw3q<}Wk8Qiz>dL0U(EqkD*##9wn!+qUSttD&!3@+h_R z&Rkvsm+=gxGMDet5(E4nqUQ>#N^U3qCfttvGWG8;5)_O75+$VXXbt$2h0iNG4rQ7# z>a>)4(7yDec7nxNzC3U~%*aVQKZ=>ZLQ#6C_l9~n8WfCuaZK9i>W6OhX>9WAk&X6c zWQ|2A*-mtjGmWPhL+D7}=?&<2Oa~frY8WcH_Z-rC!5l+Pg7$TS#B|_Iuz*&=VV%D2 zg~Omno&_|?-SnDWUw(#0r0%MaYCb6&g-km{l}v}%+uf!}qovn^YbKgT1X^|coz#B9!@)z4SbZk4f`Oen92o!-b^G*8tHT&jv{+bpz zI;5>@k=4lcwe14N6wqr??^m_Jc!?}SKF;^`@OqqYAOp}qQt!%yePZi?wvBJ@MiIFL zyKl(1Xlz-NKgGNf*M+|JnttQ&(G;!snjW0Th_V{Jjl4l)TD}v_G-mp==QPesDK18{ zA{UqX25eFhbj{(rJAW8-AuEs*#-rMH?#7{ONEbssg=O_^OES8Am5orx6dN-D6i7Oz%uGgm zgp^@KL#L8XOh}8^Caa=S$g#R~*|xHO$u8O^{zXoLRWUL9k?1d?Fnh9`9A)DSVIq5G z;YNV+ays&HDleB8MX1h{d>ONPzhy6SDR5H7aQvW(+-|qY*?G?)-cg3#bKuCJA3JjS zEpH1mkXA=%%PR$K*@9=3e$-1a;7-5`oTmn#P>%5FQ;*yvE(tbpNx*Bh ztJSWQ$ncAyY)MY~Ua%150%k z{gSvSNyi6{avVA$JF+&c2Jhk_q|i-+n&tK0T*|bi!N?MYbahhVr z>-8`brn+jW`VJT_y?W@6v0br{)_c0P>?=PVo@QgVF!Gfx_7w#uLJfE z6y-(od02;%an$Hd4MYQ-&2AOQ^^*8lD6}LC<(RymCY*RJdW@x?0X#53*gGD=M8FsET!={AJQ}!eEzlah#s3uw^ zb)yN(L~e{F-+O`e`;xlNQ))D3jY!>_UKri0-m<=SJsRlTTKy&|UAL2(2*QPa)KX#T z)0tK#BF)tz2Un)W2OrS`rMrQFBb>-=K>^A%i2C-ht6_{YQ!u7<*|v1|19cqU{WA3E73{oDo6^p^NE{LiBM7`Sg2cjb86d&k%a!~NS<4Qs%yO3WG)csC3UME; zG|4t0Vw2@lnP$JAOyQbwDZOIk(<;A4ORZ4VqUw`W?Ln2~)r~HDEmo4Gm>GR_+9x28 g*yoiizCbr(d|itC4WfDcEz7j;oBO7AeD41L0@q}e3jhEB literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3f5a53b3ce7c63a8665790d4b621e26721ed7a1 GIT binary patch literal 24431 zcmb_^4SXEOb>H6JCk_V?0>Lkdl8%xn5fXWn_#sjfNs$C8iWUh$1SLu*$*0530yyAs zcbwfLfio!C0&U50EYnWvwrT6MZu;TYN$a*r-6n3*I*n7eahs-Yn{6Anjgv-An|`OQ zo7VmR-|X()0U%W=z5DI%o7tH+GjHC!dGqGY?jIP){zCd2#m}`Y>({NW-&w%Nak+ZX zvXoV{R7}~m*n(ZOV}#?icrh-|L@^=HWHBkvR52ybbTO?G#f(Z8`<&EVR>ihiDm8Bx z`=d}Ap_~b+)W_{@){U5I&nJrmPELQ`8Jvz4H#kGM-{uVCzR?*hjyRi&n~`Hnaclj$ zv(2P%ZlAW9#!1iJ0cfMM9q9%o-JNrHslJt%{+2TY+{-I5%C8389+PxA-sy&jYp!P`oUiC2kkEp#8+9#pCYM+Gm3x)$~zl08|QD@+W zt+%U3>$W40?-S~XI;xII><+a<^`ts3&O=B;Mx9gVf&YFruAWun0!^sr)CGYi)kXEZ zKrg6E>P3NGQbqN$K(DA*)rSQtsn=9lpea>RN+3r~s~Lf2RaMOiG_U4WO`rv}5I}WR z51@u>sHVKVthCh5Rh~Rs>WVzCszr5GQY@*q#C$|8t7{VTx_U!>RG^QkH`R(j*VV_> zCj@#+y{$ee&=06jsUH;R)9M}d8G&x7&#KP}^h4^0)gKV(^Xd<(KP1o}RzDJ8{v+y- zsy`-iUr;}){7sXrz0e;T1bgV3Lq(3cSUb6YHPmzY1VzN~&+ zpr25GLH$L6zM}q;`pYZvnPbHQ#_OHxugu#w61wOV&_6$^erm;@i5;?vg~i96!YS+3 zeZ{@b!_FRO@7yEK-jz7U+&*WobN>qSyyonl+wbgEf0b{ySSye}Hxid$yJWq*7ufcc zaG@?=#hY01fTTU3{u)zZ#Qb&j(-<*7EhFY2IR0nU*Q8CO>Tg8Q&qmPCMbO`jpuZJC zUyGoxN6^nl(BF=rW9mym8NU!g--w`JjG(_0LEns^zZ*e+FM@t4!u+iW`uh>|4Q4w?VaU z3)K#RYX4aM6Y2X=^-m+{S5ZIk!%Vz*7^NMKN;}k5TI%wBQrcnXP*B<-l;%rm|4jY! zptOIXehsDlnw0h!O8XAV_?O_JQT4AP=wCU1Qk(-U2F%3QuE zbvoia5!C4ksZ)PYryNQdi0U+m&<3f~2C36gsl||yMKiJDF_d#GD(7fVIX@%i9CMBa zX|JBlZ9-(DQU{m$Yk-0v!$#{KT%Q@H1gXX^LixkFOjBdP9{RQE}$os#PQ;+dt4 z^K|hnG?jaxseA~UN}v9!(NvK80bILK>RIS2HguJ<#ix<}nc_1&>3=Iq&z^e_>7NPG z=Wb**TTEWqjrenD^ZDX9LVIu(5c8~acX6VA457VY8ayAy^$6ZFi!y@r17(W%g$7>BDyvd8Ar`Ih@V)A%}p0)URG$!tcsz`DxkUIyi+SKNZNX_ z?$qZR#Rl%pViS3uD_#~YJPQpyJ0C-d?6(U=jr(NLt#jO6l+g1Ck&|D*71rhwU{jk) zv4R@SAj~$tgc?@yWV>DlJnzKkJSQ>Na-abPbzvaNbby`3!O}#R9H6QoXSX=f~$Qq`2X{QT!-UG@?}ZI@bUoTeNnO*LA#QcodnrMQByi_1fa*YRxOx&rv)c#@urfIl%~72k3mD!%P} za>bha0mLprM~Kh&-5AuHXDsJar5{9HKaJ4T;xXqP!YeUI+lODVi=Qdpz-sIUIPoF1 z9dsMi4>~uX**z4%Nb7v&s5N2T7`*%-B=KinzQO!+pLKSVZYn-$?RqO_S?x!k_o}t3 zS9RR{bVKK_YQXiGe5IkByf<6+^14-b^No6bV#%AuV_&{pSNZ+#aveJw^EZ^I+(xbC zIi>1Cv!T85_5&xu^yP&rayXu&UF1136+|6x3X(!Y&m3!~9w|KXaN*&1ZD4vg&RYUE zKQULnQhpazv);WMw+gQ4$E3$`xg)qaRuS`X(Z-0gLCrYZG@9^ZFIJeDKR%gd43|sf zCds%?1J)VbYAlyO+xilllW?8dw9X~H^%k0Yo7Lu?saCb7_8i#nU7kDS?q`%- zr7KQdHS}J$x>#r~`RP)r=G052W5D3DXe-w4d$AD2j-z^+QmI~Ea7raVTPiIyRI5ff zS1Mg@m22jW9tg|t)I{eP*N58?T!K1dOZeR<5mAw{0Pq<#neAAPEn6j66F?igoj;+l znr&2C3r^iDdsXy}*T|Ri)2(`ip~5(5fHojWsWfW)3BK^-2(GFLno(AY>7GFurlq#t z1bBVo595tzEko~#Szc_;UbePbs8Ota=&Z0!-cVw9UOQe(*U5q2tP{lM%hO;aiKvxb z4-N1NqjA#D@EqtDcb8m0ZIHO^M^bWiod?78Cfx*UPOh-*OibU7=lZ<19dFk1no5A@ z5-N#Sq)?S}<@VAk$F1o1>Q+as0IFfN?x6HTKiWsWIgDl}Z)#jf<`rJb{Sn6hy*lts8nYAuaUd zjj1``_L_bQs9H5|b!)+OGY%U2GV2a|7)DMeHW;(x!?>qn?ctt=OVaVtBrRu_-oV=s zZ|p0*lecIL8%T!F9eD8qF6s4*or!D4^z^#$1CtbRi+VltmNgA2qvF^5AZO6)()THq z#xwbrm9UB_kgCt`Ki|0GsPi(a$15Q&KG{XQ+9(4V*7pO2wA7DJytLnsgPj8^n_h`GYRZq-ovUE7 zJkts-gaV{b6_?A96&s2rKxJHZd!(!C9nM-;k`f&U^BgK~IK-CWqet-qWeP`k=r0A| ziB}p|$j80K1>6;l9a4;!F!DVB0!Fq$H`2@oOM^CGYGLS*QRAA$_-Sy5@aSC#h5VNg zK1~NA*H2z4*IH{NM87a0QnawJ#?o&GLhd=rY%l;PjQDAMpR$B~FG>Gjc6XGZqZkff9tej3tLfDB{US$>95ghEpG zvihfi)up)YNZAy6FB41Il(&Qvp-73y^B$vMGq8n%_gV}Rkdu0R#Wq4X(GkLWH&UAB z7zM*mp%qXyI}BhHN(!hS#T5+7>^e0HWb>#!4o%?ZQtlS)MN)q%ECgb0STm-FxyT8} znS|4G#9T25Gfuixw9KTNgh7mxZVFpKeJYCuS6cO}9AYwRKn>#A7i<@0gYBYzr@xp} z8IWkiA1O^%7tdpIm?(R*M)7oX`&-#Oekbw^c#&`7P2Q-LR5=>~oTq-z!RyNMr|P+R zw>4#G>K3ws;o@x7&5IVqOf`o(Hj?KjPEYKAcwc_HT30~H)l;oe23W|S_44j)qg7M+ zDF-XA1r%PLsyTw~Y84d;*Ib2zlCNB=<()+c6za!Uu(pEAjsA8y>uy8U=V;hxWV7}hCS`Q}2NGfeWtAjXMw5;YHviFY@yT}G=X?Lzi;SN`` zI{Yzx64x1AB2O0c%QjZFTcP`qr#at?opd?A1q+_bsY{kr*dF&|1;|V;d5pL=+NBI% zzi+x#lO>evXF_mQl`#u)-C{cKD=ghq9gLq}zv`XjJ%lC03Sqet?Wr-WyRx>i$Mp%k z>#1#^?K9)riczOE75hoN4;7`GRI8JCJW~Hzr>Mg@)frmOW7ICAyTdMz3He6jM$WM= zeu8Yjrbgu0phjP1jm!*`rQBM-R$Uo-h!w3#s0uA*gx=&|E!Rl{ zt2GG9DWiv-B6ONJP76{6Jx=I3-Z-B8EK#|QmIfbp7__5!(d_nPxP&`1>4cq0;2+N> zGpWpArVnZ@Q&ez8Kdx|(<631>EXJ{XN+>d69FvA=O5mWMW#f^4wa^y%_d7?T*Es@8$HE;0tD zg>utRRC!N<^p&g1w;OJe3v9qGS!n~9@{_t;pK<)uqInKzr)$8Yu43e?Rj2$oK$?K~ znorfLIGng)f0VZLyR$WC5ysGl=MO(T2~18V=*clv zcAf4VCmHU}!36#wqo2NbabnWZ(6<9xfJqSW2gc5v?Y#4cCPjvJ#iT0})yjMg!=h=P z;9#fa_{rzwk=9OAb4(-%_&K*xnRmPZd2Uidrd${T0-j0*&$Kr$N}gcHPNp8_1D58oHM-j9TNVBhADQ$o(%WDpW+hiM8uX~Ni& zE5r%P%NbGyC5CAVJ!$&GGQH}eAHP^#Y=m3M z3ypd}2g%FuYD)B^it>8%U44@C<~zOSBP9G#nr>k1rtl8Wb{Jcb*sy0y3y$kTN1AFZ zGT(U|gz4@O0LEXE1(a*JX4a^L^212yG(JYn=J&{2YBW|J$FlaaQ z>I^0_%pf5@WstQ8dT{&0K^eL+)$l?|))i<62?||t{=niwO*bo{uQW$S5JzlfS0ht4EAD|R3m_WLK; z=@(>Q$IqZn(hYw9Bqk6qjF!04W!LWup_<=^w3x4S8Ivl&xkj}v`CVr8vxsWd4K4!* z@uCQnnza@*o>twc1-Sq)(M0UjMM2Fi~2C3!DKQ)kAcbNiqjr8or_XCW1uI_F#Z3Z-Zq2d1N63Jd_TSY9rW&O zS8p>6P3ywB(;T$YXK3#}zmKz?i5r3TwNP?{Ihj8Bop_aP{$FPvA(RAwVLBl770I@$Pi*sxY@hvq_aW;rT zTwrpgyARn!Z0-wVWI@!_jYYU`_~{F#iT>cTg60&KdeEx1zlFVX%9$=hH1CdN%@Aqm$tMfD3zk5~0B`m0e z(l0pW+Je9J#FXpla>WChYUM=Bn+*|U2VHfrl}?dX zsX66(tLgV)Oa+}k_!P`EOPz48Nz#|5mYSe(dsENk7jjU0q(}aQyxtQVrhQ+-DSz|f zvg)6)D$?1}#nW`y%GOHzj6Ab!i{{0QBr+e?KJc2MNF4MN)?S4Ht-v zOg|y(-}bguWa^aF-r7s4o4x5)yn5(G6V`EDF0DM>>JCjW@Tg2F8@`okf#QHN0wnr?pSFfjc4j{?5afzLnX0n8_Ig8y{^KCoV&5k{^ zqG?TNMN^#FXQm6lF4wxJhuqY!WQxJn_9aN)IhK zqKk*txvsquI3;cF+ARt8OvGl{zT<+!x|kMC>&8M?o7zKlG_h5g72Dgg5K&h$zK0IlgO!Tu;+31K^e^M+kr z2m}+IP+Rq>Mysw?V;yUKa!rmf*NDOpI`0|MQNlz8mIV^wS5I$~M(bddJcJ7O0a17r`7`?+A1mB1}C z?kCw7SeL@30lQik5zu)gM%S}p>-NmXpkYE>Sb~^wXQu|bz-Ezb{P7u8gM->sgA5o} z!q&Ulu06Pg#bP&iO+!hoU7cbo#2)@w%5hw)c3^s(x--~&kr5UR4j`2Ji7YjBqkA#7 zTX8p}xAjh>;?Up_7G_;KcnPrm$+?sE+JnkD|v$Em3aQIlt2Mir0iCRh8um`vw*R@4DjUIT%$P4VL!B3k4 z$WP2WOYq(BW7wsczuHwpPUwDyX_(?zSVN4-gQ(&AEKEOwJbp_2C+R7&A3=S9x6ZsR z1!h^GNp_;E$U`5r$RzMB+_FU36O&Y@x(a;k0~bi&z4tCqQl054@Cg!QA8(KHc6fF9 zlCRAIuupD5SLw5fPH{cm_a3N8`&*&r`^gW6npD0OYQBHrgP|rpZ-tug zU+SRtGgqq4RdTwYC1hC8?;|YC(S9V@9XAS}$dx=5IvJ+SXoe>>AB@+sUMjTr-ztkK zVQr=-Z;?4fcXF1Kp*#F^H4U`LYLljO*XFCZXTomG1XbTWRi_o%;6R zisnhP#sG2Q#DWDZ)@9<#k{EB>ue{Puyn$qKgwF<)#Cf4Sh#qxKwM_umXj~ zunxgAN%V=ERDpwEh)=mfUmAW7B3g7~g7|deTgDZ79ojqsL94Gb1)0qaiKZ*zr+fXRP=>6j%WH3DjwC70}*M=NH_@q^^BpO4^nxh zMTzHY=6H?(YbV6tk5K%Y{d&Bf3t}FH(>OfxFmPjmfgsV|ej2pEnI>~E5?g8Ijv1(6 z4ivWUBE9lv1k1eml82-qlWX27+Txx<`wyPMAKd#uHwBELq4fea8K4x-=g2#3;*KC!f6EsrN z{Au&_0@C&A*KlSp;U(ZAIw1(c zDY-t6Tv?M#e-UuMz;XBI7q>54{G`LR6!NAd@0Xc(!n*wBOV)B+`xqKI45Kuj19)cY z8I`-1Rs+{EQrC?Bo#hPb%^GBGSo-&t)7O%VyS+45X26_(#lF^eEw$W-&p&O)X$=^3 zV{mR=h7p&?>xp5RAJRe6(c^whvsy@(IT+_PE|s&B+UyqqUM8TaFy%4~V1uzQVx* z4zI$B-D^!@cW`O!D%?0ja;k8Ld6o2h+XR;|P9N(}oN_ER&} zLc!wJwsCJx8M^!miO1ft>_L*u&gBw9Jc?3~vj;X}mE=tXLN+UQX&&rh+^~pW*gicJ z6G;WKU>uidEJpxzONDFDTju1J+ZdcBT*wGpM_kvD%1>U^+3n`>VZK5O?gKCa0F1Al)_6>La{ycVEBG8|6Ie)rplvG9VZ6eiKVz zuUqy|LNg|6J;}slFlk(J4CV}Gg12JRwjr0YNd>4PJOF@o#59iXt|UN*M0;nnheat8 zoI0XHl`qRVCOL*wr~q&DV`2QcJn0_pwsjZBlcR!shiGQ74VDd>=rCgxRgv}p51+iG z|JdZWAsXKXzXtZfkZxiV*jl{c+@r_<~9WyNj2sYC6YzIrVS|wI3a$T|ciJ z9Aeb$K7=?HDFY$SHnRK;XE6!4cLR4z$dr1Iuw@oSzJEYYlGi$bN;4 zWv4u^9qbB?W=vc{oUgBtrsq&anH5B&iN6|A2EPi2HGg5+oWKJqn8wd zCrbQnsM7&UhmYYId?i2^a3BhuGN0DlaX1P>a4v2(`~aClt#Z~I0umvxMY4>E!4kFl zL>FtwcU+)JV;XexIN2T;A4;Mtp&NMIJvbWU!WPYAijhJk$e!^AO0plh%oru8Q@ttDID^q#{IbeOIp+G}ccV99lMB>c>g zT6tkgm5+Uh>;jxtdrwoooU?92IR_mKW9iMESK68Hee0i&$ujGA0BdvbBC z1pNW}WY0L-#F^cweqq!gRUaMc1;!*uvzXsMRi(k%#HAO?i*B`z?bh=rUYtBzJgv!g zeuAf1ihVKx$floJG{9`=p>hj;79Q`~b2(M|DRZn%z7*ug;S=i*Jd3tW*BVz1NAR0H z=HNKLg(9Z|v7sogGlF{`V-NGjqf>@~hS`1|Q!-x`kdGyZkA!#!h@?Knw{#&e9>RC^ zcq)shK=)@5v^bVViDbdFHqm#14u>6$uUF_rvo=|ZG}_TgW<0glrt4?A`=WFm_ocN- z2iRb`au`2`tZbah_A^)pGy1IfA;7}b?TCO^CdgxQg9e5i5ub)IY2b^%W1*IK4ETNH zFbtWl;fA?v5zF?fY|ZM27`GQU__E=sA(VaY{B6WD*vyr3sFnL0x+3W&;mh86xC#Stpj2-P98m)wwr+Saoh!X>J^8Zt-Yt#`rnXq@m~qfWE{>g)DuPw`07W;O!)C z*mxz6eXr z1t5h?a1fM^Eg?xo;rU^rzdicO0646SLnmS+WcR|4o~oprKGjWDk1JcyOOD!sCsJG& z^*B(7m=~oab7VnAIQzqLzX{2h*qnpKF!*yBo1pW~2%wbw5o4RLR&Z&Hg|VHB4<+d0 zGh`3Nv-nO^28S$%ZX4P(ykThD(6LN>C{4#7{&_^${5Q)g(%2-zSW{*gxBfFs!>OkC zPwOTx6HACC4NG`1o`d_*AZkZ#ZYvHer)+3-@u5^Nj$4NYF~yBYUYG=eyz9l?8q2NU z4n<`Qp?;fFhFZg`VtZ3<9bkQO$y~qm5Ds7S&pt{8a4K%2M~7m=b|QolDc}bc 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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..ec9da2e --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ffa64a01dd4659f1a8b71c6f131986d2aac7bcc GIT binary patch literal 500 zcmYjN%}xR_5bpA~uwXRt1$yPcBEbX?#$bpC6ZPV4FHPANsI=QUTO{yCzKFiVUOo8= zo}5KYw#`hxZ_@eZXMA!JeT1J$91!wFDyN2cik4rY6C@!bNCHtyYNDRhMME@o!!(m- zKoGZd%Y;dIz@cuNPSQc#ekT3Sem>*rO3rNN!D_0Ev*77{<|Qn6D&r`6h1rR1z1DVGB-WuZk1ozji=gXOPX;bbB79f9PPVzpi=t4A-CE7Od^>on}JQ&v4!Qn zbrFw7@#GsvB>kZ1RXaj{UgfufJM0a^r`52Q@YIirkTGFX#)^nBzQJ|?afdN!xY7u_ zjJ-+7u{e@&3*0#gP_D8F`JXb>OBNl6LS1NJ;GIAZpM(3E4!vho*l-hZz+z1Z0)(d*UFADyapa1{> literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..411a6d0e4f066e107a77370a27939048d6ec352f GIT binary patch literal 1509 zcmZ`(%Z?m16!oJX?&`-3AwmHm=)i*MMWz>ngcLmZaf_DBWUI| zbdpF~k`zZ)(u$>wBIYHpf;8|rD8njBBag!}u0$$4j>^ z!8n%3ax5orX*y9y^5{3Ft(qJNtfv=b_Q~Jyb+VXIC$xIGRmK{?pPuK-wK{KVtDEw% z%v-B8ga=QHrS((r5|zzr<-?Q5dbO=oZGXlv za3EJ03-<&gk^mpNm_-_-B2E}(pQ~4@bTNLZs8=q0`s0%qKe_RR)he%^<+Uu8c1bQ} zkAYUa?!tc%J%(fcc`&zCJ8z5j-mlxDl=r?rvoAM4m@^Fdmc3H7Z1jAIDKEQ}=h?E7 zr|laz1`^vg>j{i7kqA0MM^sRK1n4?j%oOK*whsYVV(9@?hB`u3-vy8>=1#8Yo^Ark zA#13z$3c%#3z|iHtW3DLoN+hwv@&J$m2nBETjXW2gRBQ@wbg~O#c~&~t!?km=R1MG z0Gh>`0|Omkhs0cbp^Pb-+J#lKt*uM?Oi{q&?i>F{X3WKTS9KQ{*yyF~x(S{(Tq&F3 z1e|ya0_HY!gfbdHV^lB!0*#>8pF{jwA~Xb2@)CUsz!J2;9&76%X=@nq(wL4J32b@Z~DVT z1SWz@?!p0mX(KwJ`fGS!B42z^OKhI^C4i1Mme&`P0cSAv6|-PzU(#?B?b#-VCi)_W zn*l}+R6nzcq-gkB0AknH=Zjr@jwY0McjHB4yCmiG{>g0U`FJrM2g>>jAmQz&KLg|@ zUXM&G(>AqHF7EHL<2wJnpOrA}FSrX^UDOuL6=3H24xSL;-VfCYs=TPbgK2XN9ib78 z_=rdR7N5|B=@Z;2vJ6*c8D8CEEig8OyLH;%D{sGadLwe`$@XqL?S1C`ntt`sWqyzM zbNcPa7j?H6Jl+37Aiu8e=#Ne>G-RjdfAs6TQdxE*cl>W??{o2>YUH+5577w*r50?& Sz}jH$5f_m-5>awn(0>7>taot$ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..206b1cab3e5c9b2ee0ef6a6e512375195b98bb78 GIT binary patch literal 2836 zcmai0&5j$#5uWb(bg_S{tNZ(^svqv|#{Ufe zHE|9c=ikm-pNINKD0&Pb9Ki}_(*CmvLz@?T;Z9uU2v>N8x9}&vt@}l=2q&Sf2Sv2# zO?u4v#1Wy0zHme&-L*T31$*HPd*48_b3A0t&Zpz?^IwZ>X{7pwp%Z<3PqXQ%d|H)8 zRYf5cx_TeyQ)9c)xbZYAikI2+>?kkf?^U*3N;M^gSD)Wi^mA0CLq<=ybOjUqgs<7e z6N4|E856z;zUWPSTPGu3Ghh2jln2fUSX@@s0cZvvCuA z{OmW+#?Ow&)1b4VhkvqX4@EzLFpgohv*vSN2X*)rV@}PMcZ|DsYA5w-AJVVgbFb#LC)gVoBcX6$0Y4t{W@k!9q|#(3x{0+^c~;~XxUH!1^$J&_LhRN=X_}Y0 zNmE5uG`?Nc^iJhU<=W&^MQAtibbH&q#?!KxsR0I5Or!hT(R5m5TB{uzqa!t5rm#Oh zd)*woHEWhlO{LBWxwKu9rvGrh{nZ1rSUyLTAvwgQ(dY zBtPToF>ady7q(`XZtbdjXuCD5UBQL>#(hCEy*UuVtbk^%fu0EsPy(L4n$1|vzhakO z?Exk4;%{-%eJ^mVBukWhwUXM5lFzhE%&ENUNb+)4sYPb;s!U9kXepC?mgHumK>i76 zY0R_B?DZrWbhfotm0ngQ^kU&_nUqorQq@i>M;lFz`^mHM7|6skRV`AhU>G;SLYmV` zD7x5YV0%T{+1m^(TxhmiG~ubtgjBi-R!fl?+1vnDA}8~+BJBoMAF5gsf>5Ox`sy80 z9(G#QA+`24TXniU+GWVpOp$<^*uf&wA=e zxF8Cj2f`En8**hn57!Rvzcu2nv0oZvWEWQP z`QWe4HZ)!OW^cZa@PPd>Yhd0n2bOj>I-5YqIYP+%@GMZ@*1`OHkYw{s^uLRyRbrI_RU)=_5`A-4c_z3JB z2sy2UOesi^j{6vxqS%lA$=z?D=98v1_b>_7M_K(NM$9QrbA=u+lP-Y96rcIoti%P5ts`u0M)ha8x5m!s2eh%$6 z>Du^fp;WYMv)iThsVoY-Eo_`7(cOM~?eqY#S(ajU#QGd3x4*$||8VfB%?-mH^&v*p z&mblr;2kjP-TSUo|^3yaZpjFTs|$wDs1iw>&d?)SmY- SIlQJ6g(SlJypM#^cmD(SU)D$f literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e5ddbaf30073cb759bf1a3cd564ea113c702756 GIT binary patch literal 1711 zcma)7&2G~`5Z<*N$8noB6j6i($OnXEiKd5E;sU5pBvc7S{7Il(EZ4hfo%*k9r&6Mv zNbh|PUIgC3S5CYFCuVlzIE_$Yqn-Wr%r`UNZ1&o1`+M_8e_JQyCs}F+%nzXF`yd$U z6GoX9(OBzil)NEKXT~LA2G?hL-+*<4nXopw0qX{9ek86nIkrEYawqTukm>P|2Zi(U z-H|g$g%ieE#ABWmVRE8wQ(DNrCIO$VxLPIAmNncm+`-XyzfSCpRCTjt3yKKGk zbAE`p15|?zM+*HAdTxU#$c%girSJjm0fLQQS{zkgapr2Jk@IL!>SuiXjff_E^85L2 z5ofzunC%>o!ieqc?-l36r}-Xk$?je7gr#Cv#wu58x& zo6@Nk(ix@XGjQiU`9Qu@9DIvPv3R_g@$BXQxQ zgn_ua54b2IJ2S<@3gN%e=~{DV_`ErS(h| P;0vUf^ueI(dS~+w9_>N@ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90ca304841447c60e02918eda3fdf77914c7c49a GIT binary patch literal 567 zcma)4y-ve05Vn)HX+v5e#=^i_BvPazu^_~P1WSbg3Gh+{=YX_MY-|USH(^4oya>EQ zRwiD7iAz!;MiTk_<-VW0A(MXJfA>DvD<$NU{CU<9AL21DSc=t{#8i-!GD^uM$u?UA zoQ1D6>bsP4YWX=^S0_-`W#oDOeSgP5t+7WHmZj`8VMJM%`SLd`uH|?<=C4~?E zEoCd{AEH0NY0r%x`c;4FcFxJD{e?S{5iPx3i@8j)DdOPx;^OoSjFOpw>N_#BTQ%cC z8i+@OGC-|JZbB7l1KPoWa^)mdQrjb~r7pY3*IeoG(}XVslpR&yEL4dKXOED@QimEI zaxm6l5MM-hV8SMNf=n}9yBN;4{%6W=yW%NWX@g(o|+g+e%uQfT&bjn!{N z4^Uc{?}M>T)flI2-{gsiw|6J@VZLW3RjWSBjmJFV_rPUlwG?A6Qx(}z6=ionm2ocM b0DlEyhFBcBN(Xe!b!dS1zzt}C*hl;W9Dkb) literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5133341e82c267aeb937542907a6f59834a61c11 GIT binary patch literal 7711 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 C3gJKi literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cb70cb22e4ba439a38d44bdc04c594fb49f02d8 GIT binary patch literal 2104 zcmZ`)!EPHj5GA=QX}y*mBS}*y2vRnu2uSP#E|5cm!in1yy|@P#XsZiBEvabbl~y4s z%QDoH{4@QL_8<0|Q+}bR&Tv<Wj&dk zzfUv$n~{@=Hu8cJ5_4#0Bhd0$xy+@>r(?w>?@xH%8|uXI*&s~@e3pWh)0*oGZRT!} zjz4gtrQ+$>VA<`a`&rf>kj0UsP_Xp_wmr$5p{_vFxxCWn)B@~SsYGxh4* zBlmIm+8*JO@8Uv_Rc;OwnG7`En#r?640)AP2a|ab36YLdC&V6dZGs>)qD^}Bw1&>X z$~ZyF*f3JqeWV`3WI={dWlQ=ea}?r4mkgrBPE7-J9aiiK@j<(Feh5*ts_#x!|$f~jX&ifzgm0QEI@`Hcd`3+mH$5)lbfPh7FdURhIeW0 zLQt*fPef_;HMp_&K@iGlo9@ykV{judhF8z)d2VjMMRlFS9NZxd^9Ut$I%G?-gm+M3 zUV|)iIWU+31_N6}5WWkUP4)laZkB+*0oy8Xnsl#q^`sV~=XQE4ZPwskR^WzEUYIxl zj}3zbLwGO`m&Ck)v9W|ZSztOr(KUUzix3~W5^iH=Qm2dO^%b=lB7@1ZO1D6cToEei ze(H`WyV&za#1rdT&k!S`yDqIrx9Pf#F}n}RY=;nP>bE=-W&UJ$a1<+D1L zH|OCU#Q1n%wL%rgLX2`X&2Zip;^S0im8K8xO}<<_4jUv4^n%&4a{(H~6q% uDq6%B#UYCtQ9HU9ZO4(bHtyJNOS}dI5F- literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0daa2915d37b46717e0120ef63cc97351ed1066 GIT binary patch literal 4646 zcmb7I&u<&Y72aPYR}>}7ik#T7lTPdkEd`6LY^QD=Be3JxR$5zbY`H<%!(zo5iYqO5 z>6xKr5fl(W?xBbH)Lx3B_x>3Linc(D{sDVzPdfF~OHcjYEV&j1yFdxd?C#9$%$xV# zeBZacIyYDSQ{~UC)dkD?r*-V-;rWhQezjXRo}Jj~xh=QnwY*-bRkEqi zjmy1qtK6%!DtPuPw4P#q6Qms^NK-*YI2uH9XJZ zd5+KHdEPwF@PR(-A1*$Xufwa8}rp;W@$){5Ie59?0m zQ>%`87(_J}u?~mlmcz?znX~0Bw)``;ynbW(;f>`d?Eb^ewnOvdM^`F$P}CBtk=?Iq zYsWsc4(yRVvfi^`j=fQLWC^{Qo1}YKu4ER-JX-blmaL-dKc6*quixxP{nf2O6!X<< zSM{@<>*^{snG!q~2~TCS9k#ooohDkQakDE1GEzEft44o6tBDu=NQxlrXd!3GCW?|} z*KAqCwQbWAespzFjMq(xJ@C3QQmil2 z=Mfj2=`>|w9H)Der4);!UBTAYt`;wMweH_&HZe3-jY#NDBbD3DuI|N6*=b+Da`oCJ zCE7YllhuzKA2+VCy{?dg?Fp6$!Ha2h%8&?g)Q)t#&s4ZSWl{QENOt8K>!t&#SQ_(2 z@#65@+S>QnD!cgj*bbg(g#V(6E>hQ1BJO1VWQ!*wUm5%HU5cg&_ssCjRHPc?5pR!J zWX{a+Ur+m#M#l4#<;LMrY%kJX7AE`H_}--PSQIuMZQi}XHoFMGll4bWAAAni?}ht{ zMM*mzaKTjC6YQ($nCrA~M4l%q+D@X*J}e0Jv>AJ$%Cmv9E$T;Z#1S&#GD}i@VipX* z(k$(maYa7liH6jfB<0w{@*TKN5|*6w?fk$vWPG61M}>TykvJ94?TJ2UC!_Q;L!21XD_I2&1I>_wmj1wE^b zHr~#sCmU%kjZ-!KAsin*H1Rk0(1KJf^V;tEOB{bT++Zh1NM4m@QsEKXJRuk&SxQVO-ASyy^?N;Q5Hh0`P2edzM zwWAHneq(Eo!p%#+K+h|Sm%niiJY5=jhxQ0>-?VrISO2CpaB!3c!4}|XIM=2N7c;~#BxaC%=sodh6SENk?M z@x6~R&?2xQ z^ovh8+rZLK$^Kl!dG>H=%K9;AZqzF$GFXy|lHZ|<&P9%IZ_49k^xj8NWRUNAj_>*v zNv&;^;z!c)7K-{5)$v>w9w8ey%8c|oDR)xq+p~u@GTZ2MWVX@gtqMO4-z{df2cgmr zQyz69Xz@QxWZ4&n9wBBx*-6UAJDtd}FqTk}`oyWy<5vOQv^wMDz$DxsXB3XUtz9c8aEg#A}OYBJ`e+yG`(kPTTa=0G-)P)H*JcEM13x z8|{Ao($ybcH%mNCjN#)cNn^%QFCra;oxm$suB~=u&N@ebL1G;Jm8!o{^>_e0!#WYms2EEa_Xed?yQ_{?cfvA xs8=If4Bnghk8PM%H_A8jZz8Ht&7YFb%wHV7?K?}(g5$Z>lJ6~CTsXb3^j|FDLgoMf literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15ddca0e55f346d931665240ecace19b31e96099 GIT binary patch literal 4423 zcmbVP&668P6`$@I&5X2Kt=3-F_J$8<My*VsYe8fMkA_GtCB zJ*~xBMiz@96{oe2W z`pxyl#nRt{e>8t}#&Q1X%>6vn-^Y{X5W*3x<1}r_n#{cOCO4(qbW!q-*DW*)%n`2e zI(|232Hmh3c8kp-+6uyd>NHCt5FyG1Q4}SVWw9X2C>O<|sGzKT?1&{%ed>s6vUK1! ztAcGh_2p;Kz}cuXee!mkC7<-Nq?e^C-AnGIE%l6{v+nBhckkW%{@o-S^wF>VLE75s zB)X`QCn{2-LDHge^rMpFxs4~QLMW%ra_4}xxnKvhA>Yu2IBTUTmi4!=<=Z!OaqI0H zNw3uxSX(4iLLavECr6gC#Pbg>tM1_PARS!V8m1j_>Be=n+kPjzPEF>C_L83H%ge2} z^%&E8O7=UKvqYwGC*4mPgOOg2utj9|h_*&5$reaMQq^Iy0{OxbTr`*?P>*tQ9D>xJ z9>5!_?VELO=4s!qN*ZTIUn>?dQ!mYLn<=@3#_6UfP(OatwaKQ69dLOnTmU@MEV#nX*r`%oyldYlj-JES(sDhB)T%1<**V9nOs5bcvTKvXdO7Q zfDACB?#d8_@t*aXq~X|~Yj68?dH_K&GsY_FFK93W(bNNgknw?mkTE12K+|Li z;w6W+_MdDD`@cH3G<7j)OdCR}UPNuy%Vn4}^2TY33Ox$L!r-KX9;r zkqlv5=QObEm)a-9f;!n=QD1AXVoa6T=QFo`N-U9{kGMh5^2SGqm&(L36tPK9=}=A> zW`+cE3E3{A=PX3-JY4$;AG0xs<***v?|^Od`(U13FecD}@UVym!SKcv&2}`~JA%gN z#q~!?FL^SMx4unF6WTnsf9}v{4KeHvvc`I+--qv!16@n>t;vz?zmTaNSW6lKkxvBz`%vUAE; zFkOC~1R?y$VdZOR+rTq9=D&!fFJ@%dR_ncM&)K{8>RgwyWDv_(^>LzN)|V>UNk-W; z(9UD9d<&v}T9UD34MKZ3sL(v^>)=D;)K9*r-DrDYdC?O%yDp?E>1Og9G>05$dFmY1 z-XLLYQ^*FL6l2L=1MNOal=j;Fw5PrOPP(PTR=+y{HZru5T?@uHmTW@pWl3jS2Qt|m zCRl*TQ@#$Nt5Y~dQ%`v!Ra2p`z1evOkl^AcXK!Ar<^fpYwYGO*70c_ zQAE6R5g^{((JEagBDCy+2nT;0@J%SB3fSSdlO3SRr^reWQ>6|0CiIh}`4l);o|!ii zfRO>!d*)u)Ux+&WSY*-O&##Q1{Rh9gFRx;lF5Qni!{j?s_N8HM9l+JGQd0Zdec6qb zu6%&EbZe;WsJbU9J|($8uG11Og6xQ=bir)*V{~T}0}gq{<7|a|;#J8w;uo~VJA5l_RGs>L+~dZ#v&9fafcQf=~^PYP@Ot#;BSD5iWQW$V&)*@>MjsDC#A7 z9ZSe7Bx(@a9rOp5mo8G?0v;k8l(Ue}EV17nq=J-_rZ;hQ`A+PWgtP0X7a}F3*f>nT$Xk-7CIXXDH z(hQ3fRK(H-i=_DEW;41V?|LyPj%rw(#^04cV5-eGz5SKBjb{U9JJKeUwwWEtu)rIo z?zmmYF7UPjym8>|>^wIhFLuElK)k(oJz2m^`7wzPN&Eofe_~kDUG!3&ul^Ce8Rc{i z3K^)hZKL=%2g80)tgKTPAU#DEh zBz=<>MC@F?V`umnRh;xAOPb9_wuITC$&_5fy@$CP-q-1yqBOG|_?12l4nyVmEP*c2 zFPi~TdJCld|IFZT7&uLU-aG~)*N#boY;>H%%;OdPs_D#^R{D!Wr47r}7vwu=ve5e$ zYPv+prA-^mU1I@hJ{T_3NJAd9-&X8UT9Pd0gxh8lyBt(vdnL%K2fh;B?0sjOkie+Zg0)C#_YJ!55v z)CRiw@T|~U=IfI_Bkd;{*;V`YN-!HAr>hRv?XhnW)n()wN~G`yYp%GVhrdtqzxgMi AkpKVy literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79cc37818f0cf867d4c371eeafe72d00c20175c1 GIT binary patch literal 519 zcmYjOy-ve05VoD9P1|&VcR+v&QffIXSm{kYECWOwHja&E{fMEj3id4Ns*OfbPz1o@sY9o@4=DwbI(@2zPag&`=p_ zvLS1#X+s;GgPm6pdz;x!K zhFs}9Teas}%kv~zg_bB}u?HR|28LjQvZ|LlZW&(*rA*)=f*l9glEKz%+Ud5bcLF`M zf3Ff<%0%XJa9`&IADj&J z?2C-=kSnKtg`M{77BpM$uix+Ye)4#GJNeUnN#~T1SMuNafcXVlZP9VUsU#&$DJ9EY z9`KF~%1+v$ssJ=o#myL8WwU$%9wl}0aEDAxsM_XI0zYC?oGNnl)?&i4g~(YYs#A|)E`5J} zV_1toWyu%dqW02;N!zpVWFJjlnE-{iiCdNxPPYkNV=yTzZS0jX+O)CKRus@il@ZFO zk#S7vz=sVeLeOtw1{l2idp)vcH9|#)w~dhe@OW(J_b2t(wY+5uP+XglUs`Bojh5@8 p9%Y$O!e-e~wQPH5rRI%K{Pil@9;_ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc7fb0b7b449de015bde33001aa52c6535f7a0e2 GIT binary patch literal 2754 zcmZuzTW=f36`q;Ba!tyN5G0O!0h6|9XfzTU8%QrfU|X;QqbiBWX>Ah)7AwxsB(>x! zGb6_mRzMNDugyQmd;dkB+L!)2_l)~B^xy}A91{kQY?Z|z)2RA;UXGE;6oXe@gf-|o{!6P(HgbD zCo+A-M%m{~wq*8-$xJ1yV02AhlWoY`l0Rns&KbVM27T_*-D-UBa8@etoj)GPnZ6L5 z38+BYx?dQzQ;esia@{jK)za#!ER`OU5Ju;4l*q{qu(>O6i?|ZSNvaR4!Ss7L^M8-F?c#9zaCZ37 z{?V+IAKkfaznXtyZj;E5{DoS|N^g%TJ>w=T&5PNl<8!~Tb$IMHbEC#bTIFO!{l9RAumxJy<#bQ#N^|$Fs5g#=gLl%?x!yMb5R~CpJg4uC`~517Ivz! zt@N==CY4q%lx~vkvz%bnGuh>t{ltYvl@r~gL*6Iy0g<19xb{_J^v_97;AqHA(n#}s zww&2Kzk@gP4hRdnJQX1iMT!yg=6ABW4)WH;mNCNYADY(@-oy(E2XUK=6^d{ktf*-C z0JtUWPs`c9i_Nt7_~Sb+R?9Krw>4ESX3gE@4>8EJm>GS)4+;(Fh@$~(S+B*cjE74tQedTO#89_ zvJ1n8w#S~L<$G70(EIR& zg5iD8+u#uSmvG8xN|y_@D&&PL!GSu~zb3JmOuy#?0KA7aL(yP7Lz#!7{hA-p7!#uD zAy02$ct2_|Yd?bHo0g-!10M)Knk=PYCDtuFwux`qpI&X*&`C-6+gqohZPg*-fF=&# zyQfhdp?xDNbb>sOz$NEn0SvY;PzdO@|^#4M!J)W4;*H%cuq%8np6bTmR22!4}qqD!_#_q6~*Zw&+r{}RfsZERs@;{{q^C4FTzmi~^8 zyG!IAk;|}oj@p#|G01HUvjLI<64_=uOp`QCH~iWU$Lnn-;v~BJ|P5<~sS{hnBV$^jB@INCOK;pZ5avTGDeBtZB%9XgQ!RR^4zYncXnF_&qbbnG!6+IO1q2j=EYewR^;nZ! z$GebE@}J2cNl*O)y7uJ1&{JoqU3+5~B{0JwhvYX;9&Bv|Z@s_bzd0fQkd5Jhd022gz0i>S+Go%5ymZ=8~nbMZLg!PnNP~aTM5o`>=WAXvHU=3}Ua8VZC zM{qLom%G0#%%rZuulK$Qv$~w6COyuJ+$_2+Q=7C%w9M*C=&N18%17ITTm>Lqxwt(1 zZl`C_pz|iFPK{9tt?Pzmo~e3uxAWG5BhrPAc*l(BSgB(N6#5NO@GSZF=Y3Po_GkI* z@$oz_#N#Ii=5+d0AK;dyY`uheI-S%6RX*qEvyk}qDEs03#iXr zI;M6%!>#qecpd`j=fEV1sUR^ER4`1`Dq)V;7OwCvDWu95_dw%{K)eUDCx&7RW?u{- znmb+aE1L1b+Q;BQ95^G{jG;M@1(HBvzzuo?Np`@MDqVzmg_`+Cdclr(E1ZR%1{++5p|& z0EMeZ8D<*?&ewJMEi4+Y$7|4rwNU<5*l@$9yd}Hj0&5ehv!Q0t@D}Q_<=8B}aqh}E zEseqib-b!y#{*c(bDP4*u_h}tts9)B#awotJfG!C>f0{74`;A=wGWI?hmP2gE;k*4 zckd3|2rjIBXl*mU6FgVQ0!&)P&l+4#?qR>Lox4eUUz2eFErcy0GZWE1&v<^L9{?HtmakxQ9oKhpL5Zz(4;!aSOPM5H zkR)X-<^{^bBsra@MXym0@olVgg_UBxRv)AE39=hxD`7h-EDI!!jpZ|+`#kV~yH;}) sxrlZ$H**DO3iE2Kxc?d5`gjVS*`s&8-ucgZL!V=`G=5@3HspTrAFbY48UO$Q literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..b77728f --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,116 @@ +import hashlib +import os + +from pip._vendor.lockfile import LockFile +from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile + +from ..cache import BaseCache +from ..controller import CacheController + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + def __init__(self, directory, forever=False, filemode=0o0600, + dirmode=0o0700, use_dir_lock=None, lock_class=None): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + if use_dir_lock: + lock_class = MkdirLockFile + + if lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + if not os.path.exists(name): + return None + + with open(name, 'rb') as fh: + return fh.read() + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + os.remove(name) + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..9f5d55f --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,41 @@ +from __future__ import division + +from datetime import datetime + + +def total_seconds(td): + """Python 2.6 compatability""" + if hasattr(td, 'total_seconds'): + return td.total_seconds() + + ms = td.microseconds + secs = (td.seconds + td.days * 24 * 3600) + return (ms + secs * 10**6) / 10**6 + + +class RedisCache(object): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.now() + self.conn.setex(key, total_seconds(expires), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + self.conn.disconnect() diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..018e6ac --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,20 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +from pip._vendor.requests.packages.urllib3.response import HTTPResponse +from pip._vendor.requests.packages.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = (unicode,) +except NameError: + text_type = (str,) diff --git a/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..5eb961f --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,353 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + def __init__(self, cache=None, cache_etags=True, serializer=None): + self.cache = cache or DictCache() + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + """ + Parse the cache control headers returning a dictionary with values + for the different directives. + """ + retval = {} + + cc_header = 'cache-control' + if 'Cache-Control' in headers: + cc_header = 'Cache-Control' + + if cc_header in headers: + parts = headers[cc_header].split(',') + parts_with_args = [ + tuple([x.strip().lower() for x in part.split("=", 1)]) + for part in parts if -1 != part.find("=") + ] + parts_wo_args = [ + (name.strip().lower(), 1) + for name in parts if -1 == name.find("=") + ] + retval = dict(parts_with_args + parts_wo_args) + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if 'no-cache' in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if 'max-age' in cc and cc['max-age'] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug('No cache entry available') + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning('Cache entry deserialization failed, entry ignored') + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ('Returning cached "301 Moved Permanently" response ' + '(ignoring date and etag information)') + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or 'date' not in headers: + if 'etag' not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug('Purging cached response: no date or etag') + self.cache.delete(cache_url) + logger.debug('Ignoring cached response: no date') + return False + + now = time.time() + date = calendar.timegm( + parsedate_tz(headers['date']) + ) + current_age = max(0, now - date) + logger.debug('Current age based on date: %i', current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if 'max-age' in resp_cc and resp_cc['max-age'].isdigit(): + freshness_lifetime = int(resp_cc['max-age']) + logger.debug('Freshness lifetime from max-age: %i', + freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif 'expires' in headers: + expires = parsedate_tz(headers['expires']) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", + freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if 'max-age' in cc: + try: + freshness_lifetime = int(cc['max-age']) + logger.debug('Freshness lifetime from request max-age: %i', + freshness_lifetime) + except ValueError: + freshness_lifetime = 0 + + if 'min-fresh' in cc: + try: + min_fresh = int(cc['min-fresh']) + except ValueError: + min_fresh = 0 + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug('Adjusted current age from min-fresh: %i', + current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug('%i > %i', freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if 'etag' not in headers: + logger.debug( + 'The cached response is "stale" with no etag, purging' + ) + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if 'etag' in headers: + new_headers['If-None-Match'] = headers['ETag'] + + if 'last-modified' in headers: + new_headers['If-Modified-Since'] = headers['Last-Modified'] + + return new_headers + + def cache_response(self, request, response, body=None): + """ + 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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..f1e1ce0 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..94715a4 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..8f9c589 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py b/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..ea421aa --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py b/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..670e6b3 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2588243736ea44a4da58bf313ffa66c11b3993fa GIT binary patch literal 394 zcmX|+y-ve05XbGr`DoIJwXcw&4I)TgD#VuwX_~_JIf9b&y#|mjou?}dULmFyA2?jk-k&bDs z6PoChrg}mrqaLbE=QQ^*p;I2MQ5k<>KdK~-$W{(6=3?*d-WMCAjBRwo2JtdL*_E-v zk@IHr;G*@gQ^Lg;TiY93Vwaz_y}U8EvaOF^qr*kLSYDTf%V4BzlwBcJNPGG+tR+-@$o(8|zm1vp( literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b123b503db891d7988f0325fdb8ffc410cd2a3f GIT binary patch literal 3292 zcmcguTXWk)6xPi*`5GrpXt^26r3PvP?F>xIFtHssN$WVlP9{{P2-T}5N*&u>DZOOU z8D`uc!Yh9S{=*J$Jn1j=iSw;kNuHH*+D#4>E90gJvu>I& z=bD65Y_6>oFYW(ou5WvOVYkorx^7|1?YZ0uT)$9hwwDW?ZHGIZz~zNbpV4H{FATWX z3%uSI&2;-*PLY1s>p5M&WVT)RMqxV$1~0T>f3U#J17sl!PN(QUYA|Hel2*s^NoKEQ*zi(+#c)mvW&yob;?f9_ez83 zA`LTk(6WxlDDsuETA=!(F$Rrw5O` zBH!n9cxTcfM-Zn&G)MlrUeCQS<_(@ZG>#9%J5R%(A#fEUk3!@j3K3y+rc><=k*H9u zY7~@zyiml8!q@QX4T5La11iQ)T~O{{d7&PtJ1SF$s&59`fpVY@wHI2T<1R1`w4plG zRpqg{NsK*gF1r{JI`gA>S4BzcO6h_b4bw%Wf z)7^V5-ErIYdR}1Lm#{!|l44|3lg|D8aWti)hnf^5y#af+Elk@U@ssXTw*7d|>5eq~ z9WpbPXe5B6q4+exMH;fGaaGC_X-2;0@xb>4$7xP8+NWq2(pg6CRVwXOS-D%Ov|Hs^ zoF(LLHN{Mp#BRk>l&`!nWe9uR@ADAk?VyS{aD^*bmSZMUAtsnyndl#lW935ajYTF| zqHU~wOq#<+-A|u5Ep4ow(`EGxm;5qWKkd|5Slw)XI_5Sz<`%khI}_s<$S0 zMZNh-y(!eCiFN3QC4VN==cfyxudTMP!nEuubw4wfe^NDzD*u4gXJ0g_8$A%`@6vPp zJ;3{bj{u(lt^hs*lmU`QCm;YNL~5zC+{qK>yFv@Ye{AnFUU1#3r41 zWYG6MLfna3aTc=@EN+=BVI`SqrC8ERvy_!#X)DVzR*q%qOP#awY|5HudE(l%h$H@6 zeeQ;cBt#@(0e~!o9|A4|u-FiM3DLcw1-J+J32-0qGr$J?0&obL#hFuS5|L_y$}RL( zeL+MPTlIQVMDNxcjnz$IR2v(05nHJ&)|=}UVbtzcnj*5fw7gyykygE3Ul-}d^5W9E zG-20&6iF$PDF`E-Gzl>ybtBV|Q-`l^)FEZ1bm;0t4VREcwxnwk&n)4W6yH}gd?YEZ z8mCWva)#si|G%_Vr}HR8Lxx~}h^`F5!|)3Lm=Kl#=+qG5gbd&U9s;%i+W-%+19(L6 zdTDu;ra5@a7XWp@Ex;mR39t;f4Y&hn09F7^z$yTZ&VK;304KzecalAAQo!b$rXJ6q zoqB9A|IR96NObgj&<>u{e-=2w(*)rxfCi-@cDlo()fSpm=nKm$BHCPStyCH!A^X>^ zG#Y0{gnWZU@>_n?OdPY=k>K*^k{2=CX8n$BkN(OMq~j(a4!~a?&jIi+B%=KXJ8mbC zUu?O#$Ts9ih_o&YaG#h*Z6YEvN)fHePr_O26!Gsy{|?_r$bw%WFf`fcdYn#EH;r5} Nm(I=78I7tq{{c&mcHIB~ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d69f9615b5ca28ea2a6a54ed4f8492700eab62c GIT binary patch literal 7024 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 F@jse+X0ZSO literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f3529f265669caf6c5a8fc66de533c74fe2d4c3 GIT binary patch literal 1615 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd180daa3498cc40d6a00aa2ec9a3fdf40cc97f GIT binary patch literal 4517 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 W4IO-({%^!5G=TXYD7%%JiuV&Pw3k@` literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py b/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py b/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..b7ff6f2 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py b/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..834962a --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py b/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..3d1d2f2 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py b/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..60309d3 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py b/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..d186b0a --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c14c033a7772035e7f6b538e0b3f3216f3bf40bb GIT binary patch literal 992 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 QxSqoI_Tq{BzWm<*4PwZeH2?qr literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ce3a4314ecad48a01b1e334b09968c7ab7e641b GIT binary patch literal 17325 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 Ns^!_MHsv43{vVh@b0+`* literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2a6c0bc6c98d9749bb60b7a513c05c2d63841d9 GIT binary patch literal 38549 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c2c932885aa0865a8fe70d5b5628ab5f7c8b707 GIT binary patch literal 5987 zcma)A&6C_l6<6zfW@k6+wY~N_j-xoW|m`UcdKy zuXSy4vHnl%U#;JsRg`}#b3YyRTPP_9;Yv&4jH@AQG5J(ms(flKO+NLO&NZ%wM&E3i zeXC_L1@A^^_iL>h>gFzM)jv?U#qB2wxBZ2&)@txNuW|DUYb|p1p3+I

^nBh5q*?Yh}P;-^hkSV81I!g@t5h%#R!!q3{o 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 GF8&X^?r1y! literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1664c5a41cd962c93adf9278e1671e139a36c212 GIT binary patch literal 27030 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 bDaHu#FKP+i%)caR&JK=zEXKbKN;v-ym&M$- literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80dacfebe9db6c631dc63804cbbf75e91e88844 GIT binary patch literal 10859 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 Cift?a literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6b6119c5ed241461043761c3c03573daf0fc09e GIT binary patch literal 10026 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3921458ed4ce5d5b9fdab1d16bf38c9d133d8854 GIT binary patch literal 20969 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39ff85508feb2e9cb3844ed53b17e44867bbb561 GIT binary patch literal 24990 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 LNuG&2PUQap$ZjR2 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..700f9682a17b349587c13a099125491a63f370a1 GIT binary patch literal 434 zcmYjO%}N6?5KcYVveJuBFxP_JMOP3+#EXX>6v10BA-hT2so7-B%(nEAd=Y(zUVRHs z&bA;1zG3Fe{Cty?<8k&m{FPIgKqE0$&6ORzs>z8tlZ&TlJMReU*rKzr zNU?#J9j{`55{ON(CRy-UC6mz61uS9$4D3=c9y)RmgWu&@HVYOvXggtRZ-}I)6vLtm zHDe4CB`3w5a2UW|<+?KUTN@MS4N{#0%%p3u&So8%r2{132*z*CjsTlJ6L^JTNgxFz z&QWcdUmhJ^8HVPt&#h#-tm@G76hlF5Wdn%S+SN?3Mem_kpMqfgM)Xz!UH0`Pl@o^Z32nj?bwjPGWWkQUJ1D9Sv0&tI{RBaOLBvTyIB;4* z0_{r^%02G$;KWP3#WwOfrC$X}0OS>^W1oo5X{07V+!fs^@Gkc*Aqn1)n!YBBP=rZ{ zn)gw&hngSOn&>AiqpF|uf$$#pFG&(^EFuB3K{7y_+i0_eHlH>&5f4yru-4=B1sU}( z#!oYL+DK(|Je4XgYF?Zbe4dptD>JQyj4+O zB$IBlNT&rl4Y5rfSAb(d^~(qU3uI56rvSBYoglEu?3n=2DG$ zp-oxj<22vYJFW`N_M1hU;f_nlM?_!%Be3D|rWOW{iO0Pz{WkRo2}72|z{+(ICL?O2 zLKn3*SGN1j;RXHo=e7KF#ZBO7I|1N>n{~;28{Hx&-o6`R1imH1{GV_c- z3sz(W$nS74-6hhq@FwDqz+DUJAg-l}@9I%c4KRcaTA}q& zWIOAT;b)=kjT2#9*O4}&Y9&Q|VtX$ajd-S%RMt00+AvM)tP*MJdgct=@BflrS$7b$ zi%B2?A7My+7!7SVO}S)gYN^!9O~G-n_sH>zs%eK~`_C)4q3ggsv~Zh{rfn~6Z-OD$ zqCS&li8Z@LZD*idXgfSIMiu$otktfh*Y1%UiwzGe$>*hb+`*rY5&1NPkVYPbZ5YC} OfI^7xfDV1?(ud!}5&38U literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fa79aedf6b23252cae68b6bb34c016257443de6 GIT binary patch literal 21387 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 JwjBUG{~H3GslxyO literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1752e8ce938054777730f9ab90b43f5e322c4ab0 GIT binary patch literal 62998 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 i|<9_ClSK&{&<$v^N5?-EPFsVOp_Ek z2qnPUjZIuk*T?yd=}wO#9!G9c`7CAV@Hyui`+d%JqRAW7yeQ%9F`wg!TLW?`swkg+ z7j0SrPqlKTQ7(U=hc*VxLu>IL$kf*C?x1~xE~#tL{w%dCHQ14yC4~Iix8-o@`k}+p zJa4h2ica|p52o*HoLbVpOmRwkKHn?Bvupe$J>YAc9KNW+ydYmvO@<+t^-y$mGtGOd zeW<;!s`j#KKUJXwKV1nF!q>IqHSPGhYMTGUU#T#+i|k2KV5b(H#Hi!(fsE`OtFzr1JDVPdv)4=70DR2n&l|c&^y2&tuIhv z!6$vPd~#N^-*lLC;R;B=BY;Z%{O{!d_6(9D`I@(qwYd=F3l|G_7LFEn6m}PO1-lCe z**Z)f=OEY=+(~xl0e;_C_)JhJ3ZMtWng> zQVb){Ymj0zi1dm{9!OnKfBM$HJ)-)oU$S+~>rcE^Z?10Lp*I_{-qWWC(95T?9k=It zu;@SZ|Ky{mKP`0Qlv@ZLM ziZvC+vWy$t%X2t}k=)d3*5@>g{uQzBpbziNK0aG*c=c}W2`(?7*B}yE6fD9}3IVWy z4BUHNTWXvDygCr?l5aVSyFns0*~;`LlXx#^u*OP*#nfDnC1knYNn?;`OxVo)0&YYV zLJ?`R#&TF4bAdoMf=g4HNQ^%lFP0br-A%9Rkw_<$2)j!p*NmO=+Jlw`g{l%rT%vz7 z+*-`;n6}-eVqC>83MS0t$Yg6KyjMqvSelrwlRl(;X_@D(u*?87N1H2`r2?W6l*<YLSuuP6f2Ag_?vXoFmKA3w7(*#vc!*as`|-)3ZndHwvg?psu0uE8_f z@vaJkp?{XH1i$a-jBty?pY`9qpec%N=-xQ5N3BYK{VDmJMYQbD(IVcOvl)mBwpSMjupH5CAQ zZn=q8aO`BUr1dqzZQ8a~#e*vDQejI)KB^jix~z<#n+K}dtPgmKDx~5e6-yL~M{k7Z z^>e3+hjqp^?NG@06j9->LbQ3f5fZsyiXyDEO5;vE%#Qt_S&lcut&iP6}2a}E_fcoB~BsITPXI;sIxKgw$k!jObc z*@tlRj*qui3;}gyK(R=ujCUJ+l5C6lKAoZPbbo$wmFQ}2OM98l<%Ni$d2uDq=0BfJ zfsh4#l6u^S^)8|--1^#m1h;39cJjzPn}==>HWqfeE2|_Mq@?6q)CRM`rr~UlPyg`f e@YhmTD8D%T2(=;pqtEuXy0(>u_Xitt>Hh%_b@4X< literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..ec28480 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py b/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..2b198dd --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/database.py b/lib/python3.6/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..c314426 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/index.py b/lib/python3.6/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..6803dd2 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py b/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..14789ef --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py b/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..9f03364 --- /dev/null +++ b/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 ...' % 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/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py b/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..75bfd68 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py b/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..f07cde2 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py b/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..792fc2e --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe b/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/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe b/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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
, , and 

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/lib/python3.6/site-packages/pip/_vendor/distlib/version.py b/lib/python3.6/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..48c17c0 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe b/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/lib/python3.6/site-packages/pip/_vendor/distro.py b/lib/python3.6/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..9e7daad --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..7427eb1 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..415a61fa0e1e6fa5da5f3d365569389ea2a12838 GIT binary patch literal 913 zcmZWn!EO^V5Zz7EWaDhoAoT;RoSH+ER;8+h3IZgc2a1r0RB11kH+D9r_Ik0sP18T( zN8lg!%BjD=iLpZkf?fIT?09D0^Ndf2L-eipJxkkB^dtJ~>4NMRYLtz@PFSBIHee|m z7Ts*0jj}P@{}fHf^eT=bbh)^Ck1J}dC<`n_Zm8MfoLbJXF0os4e0}+9as3WYeB{{# z*@`d4N-U`px}4z!MEG=Wu&|hMD~b|woyIxGORXx1%O%Gf;ntYn3G0Ap$GXyW$*|b5 zY=mT(`hQhPu6XGz-f$_87+(orksG58HhigXIY@MC>JTtWY6>p5|4}K;xGBA$8>cHM zmE+v#4d}Epgx=gyPlIbq3;qltAl1gqu`!u&&){c{1-6mn;R#@m)Gpp$#fPzYK&yBxUrspB?(D#5m z3;^!CC$r=HB$0z4~~5?BX>z(jp_2>BYB1JCK<=f&KqYF>%zC=@?>dg{J>KDVdd u6&B=`Oq==RB<6&OQaD0p)wW44;0n}|zeu5$9RqY)2d#rR^=~VQllCtWm=SmY literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f4bba980f186aacfff715e3dfb71bd100e0047a GIT binary patch literal 13807 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e52877afdcadb03505b002002dffb6e94a7e1010 GIT binary patch literal 42111 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 literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d73fd716d4308864f8657d783459dfb5063bdd50 GIT binary patch literal 3320 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 GrTM>6*%ZbA literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..d6d1d6f --- /dev/null +++ b/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..7c5639f --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d7606f079bb6e63176be01dec0a99adca90bd4 GIT binary patch literal 376 zcmYk1y-ve05XaBXM?*?WhQ0t}hLWKm7K8wS1Peld1bDGpY=ps%gX2`nBk>~e4qlo1 z3QX9UIO~4C``fyY#blCyjlRh)0{DS{Humv}_x9F<0YefLB1mC^RYW2L46{haDj_KX zo|2?524&=x48a4`vl#f+du}cfg!2S-`UpHD35)NbOg6qQl#$z6u39ZS%c)R}Hr8cK ztVJty?TW4z&zf;6h2>@`+l`+RO61~uBlvZhyPVRO&US`VYOsGZQ9$hBaMPPK1nEs5 zzLS(K?Qox;hTM&>hJF{uX!8jsEIi=%tg@=98qv&Gosew4zpx)~hwUOrgVQyynKsp{ rRq{ZJRYgPLic(PvOX*(IyX;75)=7RGCT^!5GrW!C2%`c`QHuWn#B5y80Jd?6c8{FvM48VC`%#f zE-}>0oT0t;W9*A;A7D3Kcj{N@Y46cVXAc#?CxUw9`~7*;!RBW8XXmf@Zx7%fSb2P$ zKf_@jV~`-3f`Y}Y;4v?}*kiQDm0z^t7K0x_deXlJ>1VBl7q?~W7^3!j+zFA_+(|~J zR5P22yr@cTn?UBTa+8jHnEtrbeT!esFy*cq0Lp?}mv1M91(zY0j=_2k4U_yj zsQC+6Fj|egVajd}q=V_e9USIM45v`TFWawK%_i^`H)y|R@A!p(41WNs5gMClYktk` zS;QN@|8>JIak*XTY@A=}4xaGg>A)7%pvtR9qgk%xqsIsKV)Csypd~lNt86MuJvg(4 z`bOoWfgqX#LEQJNs}JF!%8gCSqB{DFa1qEh%kVAjcQ7E}t`JUSAtJW?(7XNG#fb?p0N>&P3%q&vW8pO; z$c*nO`5}hO2Q^G!0WU~BUh@emi0XwB1-}SiVs|>>PkxBF!=R}`0zTh!06&$x2AGU?fKPBzW8a*&b+1N%mrpESDeNSK zEZG;>Pe|h-(!jp1`3C&X_pmK6yT7`E#QHD6V%CEFhM7o^58qQ~q2w){Oi#1MQ`xi$ ze#)-C*Sgeed|Cc~wp*&iJ;vVfq;@nU1F(Sk{2tq8+kC#`xUOfevHWPu=eUzhA$(*> zja>F%Oh&LF+D_-MA?m1=HePXIXT6%hpF=^O8xj=Ig898qfO2V6soMlXOp_uLq6vj4 zN;y+B?+I}+OVrJmju5g;g;;jSE*|Uv>aTFtY~HkMnkj`Tbj@5q7TYv;%}aex!-N<} zv8^!Z1fjbR!>B{G$1^+ASXDxBvhE literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39193a643cc9a5e2b63937217a1d9e0fc02ce72 GIT binary patch literal 1978 zcmb7F-A)`g6t>4Rv$Mkj8z2$%ciW^@S8d>eR+Xx#f+kf}sp6(lkw&SkVQpYG^Rw7q z3TU{=@)Ui8zDWBHzU@_Bp;tY}vycU$w0PxX@3DQp&*#UpIX@r&+4?K_-6!O4GSlEc z*@CWr0wIW?IVosD3or2smN1GsFZYWe3EiCKts+VynERk_gFdF@2OpxeSgt2Yp ziQ(pSBwtf7G(c;YjlpCKy8Z=(BncHH@dOp#1xc7-!iUjsI3XJm!T(USMGRw0tcZ@7 zzo1DZ7Q`ZG+M+A&!5E7ru?*v!m;?UzRRG2Z9tdn9bad8J==vChAro@$oqSW%A)SzC zdGDn>)xBb@O>a;3v{6}kpe^ag zmT76MkIOa&FPGY+0zrm6bN&A~mTEAQpx0ht}6J z-?x6F92}-fTLyNmk8>Lwr}jKi=#I<*n!S(zEmWAyM62tq@;Kw}y~U-G(iiJr|P-Sx|z zSHZy`VRym7^EEhhNM45EFuK#HstdZlr_idpj{-?IVhv`t!}*{pO$zSf`~hgRi#t8L zHwApNI>2nihT}C*LjV+F*?@YM<+5y$X@h(Nw8c5>;2arT;&rBYZs8gf!d=}DlkXK| z{q%lzd8aZz7NcAivNTe-5W}_IeQ%(mpP|?|e{Tl%%CBzaEq(>B)^zO>_doqQ$N7OY zm{6R5ID^-nUh`^k=XT5voWV#AY5m5r4pm{8ry;fBNXh-|s=P{j%x4GgG5cqtC#Of_18Y57v9efDNw2++JnDe3%;~eKup-1C1Z&uVhU{1Y@ z;(ZjDTB?TvvqGWo6<%E-^h{)2DPXy|x4jJ$_s~Q%>O`#h#cp)#JN-GNus=3q1r!t( zyJ9HtLjWHX_jb9hY5_EM5gxns=|i`!As^kN8}PkUOWWH1?kQgUHaa$X(p>agta2TJ LSn)cv<8|1-{)?!{ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fbfb16eb17e88103ae296cb826e9a21aab60665 GIT binary patch literal 2183 zcma)7UvDEd5VyU5vrXHy9KBY+5kP=~xD=^y_fl1N92^otdASOt2xKL(+itqMNo}X3 z)#iotlkmnj;1j@i@GDRE#QQxl<85-+>U3gP9^2!wXXZDa@!slc@>leC_ur6^f5P9g3MUcgLt(#Et9TB03u84?a zGWWVQ5kDiX+H*LOv^=}s>+4ZAF_NeGc%+PtMS7msd|}iQCl-| zYPh)=OPH+mQ!NLEXY$BAr+6N<{-H|c01sb$9t<8q(@%j&(xrlQnV^DQk*+5^;X@DR ziV*rhL?VVh6g81RABl#ji`6UIjm4T+2To0_fcYCLhQkI72!7b3nkUfo_dpC_g$hbK zq;v8OnbSGd_Y4!>oc=~jS`zLVzgnH+ED%1>Py{9_LH3BjEEWV*g`EMqh99cIkZ5e% zKuYpUV@3_AF?7y;B$S*nw~2OI%q9S1p-rzCNELuIuvq&GOQ(MjRfqYD{aurfcgN}Y zet(i?;{KO==4|*-?;*=Iel80!QoAQ6&%Vmi{w_Cw?(X=aJ-&ER+dr0toQ~DO3ffZ{ zciBYz+nlFGYB+E2XQKf`?x4LCzTAGCWzAE0p_}H#m`ShV?R8*m^Y|kJ7?uaM{-~JF-4*bzWCw z6->7A!psC6Ku8GPqA?5U8V%{?>J3+J1RI@o!N#2!&LKGsAy|MrRc`^W#ncXT)&m=F ztF3cB7!{@m!QmW*9d?9XZd@yTxw;HJ0&_zt1f9U$qLosn?t(z2nL5q4l|~%Wq~Lt( z6@B$lgz@>Hz7*TL4!Ik;kHaace{ff0%t=g z)$e6Ej265(rKAi5dq`%%+4LvW0!5?r%fJ-}A5Um`9kmYjEA*%ptGA)Eo|eWYkoU^y zUsH3UFyso$g@XD{+)aTD6QUJWcQhO;d6Z5q%SM)+q&9GSElt%1%HPD>@!ki%z6XTR zZJMw;P3RVDxV-V%CT-98FR>ReS!9n|6BW*gIRi8vK<{1S48?I6 zEO4IrMIDN#VJ_UC%+0;i!ZefDJIbd2rl|3IL z;}ayGB55JH3530K($lU4aYUI{AU*&=y$OT>CcZ;vlhxT8j4yW_8n4@hH$A~}RP=Jm zxlK6FM`DuU7^=nDq?c7I>K!!XJtPRfY9jdni3`2OdJRZS<67)h ze{$EYby_Q^^k`xx3Y01=HOfPR?~PrD2cdoa7_@adb= 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/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..9e7541d --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caea555a5c4e9f01b249dc3fd7b17b6dc1885dbe GIT binary patch literal 151 zcmXr!<>flYemsf+2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUoQG3xdr+KnFYE@ zrI|S?x+caYg<0ms#vmaujxS5iOUW9V){l?R%*!l^kJl@x Uyv1RYo1apelWGSty%>lY067*Vl>h($ literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2158ac7d54f767ccec9aa8e589ae24c6cae4488d GIT binary patch literal 1022 zcmZuw&2AGh5VpNP*(PZls$P17VXmH@3HGs^pYj zc@SO%-oaN+eFaX;>{6%@jyyZrvA_Agnc2h5&E~hp_c&vO{2=#M8~o?6%>@`i1XU!X zG0j-aGB5Th5lnc>&w@ChWYK{Wz6!HO+@R!)%pUqgM$@K#Lka$>=tdp=KxXVcc}YYd z!W$w&8BCgMFK&v)Dd|SHkd1Ubx6MZ;SEZFnniaXWE)wZwYSMh>I^`@K=RzhbwNi6s zZYkcO&L43j;n{kvh160UrDHoryt@S&YfZc0ND@;)VkW3yHzf9i2l;&$zDO0oju8`A z@OvXrRg0^UB@;SfOR}a%y!E5jDQDc`(#PqL9OOnXHYNTvN3eNT@=zqr(=6}=)Y_D5x^#Qu{*JD)r=hxn@6 z$)%i$T=y<)rk<*F)H|;VV|rW_7kngbI_8R7tJ4v*$s8057xfj-MuHC>AP?B&`cYlZ zgCxObCCNcw<#5joz^TsyF>fjtU8b8zt_7wW>JWWY;-b5&x`BT~1JfXd3ji-O-N5-q zs&g0Ed@5%yKtjg(GoDEoTyj;)znb+ng6@F9;WiyGgznHb4e1u$g=a*sxBuZggpmLS zh?gX;nIu^*N`-zqN#-S2b)-VQm#M0Al@2waCWHNnXr*b`Z6VZoX-f@I8bjJch3iW^Kp(Qop0ZxHI-Mg&K80~=M9q$(! Cuk^_P literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0feb1a352573a9b4cf2ed21917c668bd55d5e852 GIT binary patch literal 801 zcmZuvy>8nu5GF-QR-FVciq4%nR70Y{ExHtifdc84rJI(6EYd9v>L(->poKT*W%45J zJ7~?+SLoC`Dh`~Y1n!RFeZ23xqn2l9^PjU{}|$Z=y14 zL@7A?%w#0REt5jUdr>Ab{=)L)H=DcDifF=R>ROPAV|k zD_a>?)1AYLaI->luhA)1a>>d_av9ySQb-|VjIm5)iZPKh H@}>9-M+vU} literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bdd724ea29ffc3f85e45a43d72af82092fa6630 GIT binary patch literal 1652 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 Kk7w~ADfS literal 0 HcmV?d00001 diff --git a/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f7dbcf8830908a0567cc65e7c752d1a88a4b9f4 GIT binary patch literal 1227 zcmZ8gOK%i85Vqa!p6<>(q9_{(pw((6q#dnb4%t<5KnMr}w+Jz47xfCYdfE=@iTe@T zlMT`26i)mA4xIP0e+2%6ublE1I8oKZBf_KdbiM1Va&7f`@%zq)#Bf4Bl1m48au3K< za0w!)A|*{|$r4t2iAPb!6i>MD1Xq3;Bmu~L5vWcXCSe&R5%8T^ETeOpM3T=|L@1*T z0$leo5s`>r6A{Z`);sr-o>&px*Cgo+HX*~_1>__{&keGvsny)dv?!ZeTNjGrxG+Us zxz%}9S6p1`})slbm@APk4t+KUh$+12Voz z7G&lf1}G8!HaVl!Gq4H3=J|pm34aHrcNerv^ai~-ilo<;zU+gA;sngAyIEPLsAm6cNas0zlFK+$0GLw7kg z{}cVi#ot>#^mPDEdIdehG{yO)sr#v&%o8n*)W`Ds!17wDtT8fe^=8N&H&X2CcuX>fT;H8cCG=HMvca-8jEsFOC2MJgLY9~SH@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/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..026748d --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..8921052 --- /dev/null +++ b/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/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py b/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..f7043cb --- /dev/null +++ b/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