From eb15f688573beb2475c6d5ae75dfc019b27b10ab Mon Sep 17 00:00:00 2001 From: narindergupta Date: Sat, 26 Sep 2020 07:17:33 -0500 Subject: [PATCH] added latest requirements file --- .tox/pep8/bin/activate | 84 + .tox/pep8/bin/activate.csh | 55 + .tox/pep8/bin/activate.fish | 100 + .tox/pep8/bin/activate.ps1 | 60 + .tox/pep8/bin/activate.xsh | 46 + .tox/pep8/bin/activate_this.py | 32 + .tox/pep8/bin/chardetect | 8 + .tox/pep8/bin/chardetect-3.8 | 8 + .tox/pep8/bin/chardetect3 | 8 + .tox/pep8/bin/distro | 8 + .tox/pep8/bin/distro-3.8 | 8 + .tox/pep8/bin/distro3 | 8 + .tox/pep8/bin/easy_install | 8 + .tox/pep8/bin/easy_install-3.8 | 8 + .tox/pep8/bin/easy_install3 | 8 + .tox/pep8/bin/pbr | 8 + .tox/pep8/bin/pip | 8 + .tox/pep8/bin/pip-3.8 | 8 + .tox/pep8/bin/pip3 | 8 + .tox/pep8/bin/pip3.8 | 8 + .tox/pep8/bin/python | 1 + .tox/pep8/bin/python3 | 1 + .tox/pep8/bin/python3.8 | 1 + .tox/pep8/bin/wheel | 8 + .tox/pep8/bin/wheel-3.8 | 8 + .tox/pep8/bin/wheel3 | 8 + .../CacheControl-0.12.6.dist-info/AUTHORS.txt | 562 ++ .../CacheControl-0.12.6.dist-info/INSTALLER | 1 + .../CacheControl-0.12.6.dist-info/LICENSE.txt | 20 + .../CacheControl-0.12.6.dist-info/METADATA | 71 + .../CacheControl-0.12.6.dist-info/RECORD | 37 + .../CacheControl-0.12.6.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../CacheControl-0.12.6.virtualenv | 0 .../__pycache__/_virtualenv.cpython-38.pyc | Bin 0 -> 3991 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20542 bytes .../__pycache__/contextlib2.cpython-38.pyc | Bin 0 -> 15532 bytes .../__pycache__/distro.cpython-38.pyc | Bin 0 -> 36583 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 240354 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 0 -> 8024 bytes .../__pycache__/six.cpython-38.pyc | Bin 0 -> 26906 bytes .../python3.8/site-packages/_virtualenv.pth | 1 + .../python3.8/site-packages/_virtualenv.py | 115 + .../appdirs-1.4.3.dist-info/AUTHORS.txt | 562 ++ .../appdirs-1.4.3.dist-info/INSTALLER | 1 + .../appdirs-1.4.3.dist-info/LICENSE.txt | 20 + .../appdirs-1.4.3.dist-info/METADATA | 256 + .../appdirs-1.4.3.dist-info/RECORD | 11 + .../appdirs-1.4.3.dist-info/WHEEL | 6 + .../appdirs-1.4.3.dist-info/top_level.txt | 1 + .../site-packages/appdirs-1.4.3.virtualenv | 0 .../lib/python3.8/site-packages/appdirs.py | 608 ++ .../site-packages/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 555 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 0 -> 3077 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 1788 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 714 bytes .../__pycache__/controller.cpython-38.pyc | Bin 0 -> 7781 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 0 -> 2181 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 0 -> 4206 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 0 -> 679 bytes .../site-packages/cachecontrol/_cmd.py | 57 + .../site-packages/cachecontrol/adapter.py | 133 + .../site-packages/cachecontrol/cache.py | 39 + .../cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 299 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 0 -> 3273 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 0 -> 1559 bytes .../cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../site-packages/cachecontrol/compat.py | 29 + .../site-packages/cachecontrol/controller.py | 376 + .../site-packages/cachecontrol/filewrapper.py | 80 + .../site-packages/cachecontrol/heuristics.py | 135 + .../site-packages/cachecontrol/serialize.py | 188 + .../site-packages/cachecontrol/wrapper.py | 29 + .../certifi-2019.11.28.dist-info/AUTHORS.txt | 562 ++ .../certifi-2019.11.28.dist-info/INSTALLER | 1 + .../certifi-2019.11.28.dist-info/LICENSE.txt | 20 + .../certifi-2019.11.28.dist-info/METADATA | 74 + .../certifi-2019.11.28.dist-info/RECORD | 17 + .../certifi-2019.11.28.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../certifi-2019.11.28.virtualenv | 0 .../site-packages/certifi/__init__.py | 3 + .../site-packages/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 262 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 0 -> 486 bytes .../site-packages/certifi/cacert.pem | 4602 +++++++++ .../python3.8/site-packages/certifi/core.py | 15 + .../chardet-3.0.4.dist-info/AUTHORS.txt | 562 ++ .../chardet-3.0.4.dist-info/INSTALLER | 1 + .../chardet-3.0.4.dist-info/LICENSE.txt | 20 + .../chardet-3.0.4.dist-info/METADATA | 98 + .../chardet-3.0.4.dist-info/RECORD | 97 + .../chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + .../site-packages/chardet-3.0.4.virtualenv | 0 .../site-packages/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 855 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27184 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1139 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6225 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2256 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3488 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2915 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 360 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1146 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2653 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2638 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7479 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2456 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12068 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1147 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27188 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1147 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19112 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1155 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 3028 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22140 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37613 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23637 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29101 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23595 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22222 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22201 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22224 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3408 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2271 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1136 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16759 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 3024 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1634 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2492 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5836 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 1997 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 444 bytes .../site-packages/chardet/big5freq.py | 386 + .../site-packages/chardet/big5prober.py | 47 + .../site-packages/chardet/chardistribution.py | 233 + .../chardet/charsetgroupprober.py | 106 + .../site-packages/chardet/charsetprober.py | 145 + .../site-packages/chardet/cli/__init__.py | 1 + .../site-packages/chardet/cli/chardetect.py | 85 + .../chardet/codingstatemachine.py | 88 + .../python3.8/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + .../python3.8/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + .../python3.8/site-packages/chardet/escsm.py | 246 + .../site-packages/chardet/eucjpprober.py | 92 + .../site-packages/chardet/euckrfreq.py | 195 + .../site-packages/chardet/euckrprober.py | 47 + .../site-packages/chardet/euctwfreq.py | 387 + .../site-packages/chardet/euctwprober.py | 46 + .../site-packages/chardet/gb2312freq.py | 283 + .../site-packages/chardet/gb2312prober.py | 46 + .../site-packages/chardet/hebrewprober.py | 292 + .../site-packages/chardet/jisfreq.py | 325 + .../python3.8/site-packages/chardet/jpcntx.py | 233 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 333 + .../site-packages/chardet/langgreekmodel.py | 225 + .../site-packages/chardet/langhebrewmodel.py | 200 + .../chardet/langhungarianmodel.py | 225 + .../site-packages/chardet/langthaimodel.py | 199 + .../site-packages/chardet/langturkishmodel.py | 193 + .../site-packages/chardet/latin1prober.py | 145 + .../site-packages/chardet/mbcharsetprober.py | 91 + .../site-packages/chardet/mbcsgroupprober.py | 54 + .../python3.8/site-packages/chardet/mbcssm.py | 572 ++ .../site-packages/chardet/sbcharsetprober.py | 132 + .../site-packages/chardet/sbcsgroupprober.py | 73 + .../site-packages/chardet/sjisprober.py | 92 + .../chardet/universaldetector.py | 286 + .../site-packages/chardet/utf8prober.py | 82 + .../site-packages/chardet/version.py | 9 + .../colorama-0.4.3.dist-info/AUTHORS.txt | 562 ++ .../colorama-0.4.3.dist-info/INSTALLER | 1 + .../colorama-0.4.3.dist-info/LICENSE.txt | 20 + .../colorama-0.4.3.dist-info/METADATA | 411 + .../colorama-0.4.3.dist-info/RECORD | 22 + .../colorama-0.4.3.dist-info/WHEEL | 6 + .../colorama-0.4.3.dist-info/top_level.txt | 1 + .../site-packages/colorama-0.4.3.virtualenv | 0 .../site-packages/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 449 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 0 -> 3234 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 0 -> 7743 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 0 -> 1710 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 0 -> 3986 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 0 -> 4670 bytes .../python3.8/site-packages/colorama/ansi.py | 102 + .../site-packages/colorama/ansitowin32.py | 257 + .../site-packages/colorama/initialise.py | 80 + .../python3.8/site-packages/colorama/win32.py | 152 + .../site-packages/colorama/winterm.py | 169 + .../contextlib2-0.6.0.dist-info/AUTHORS.txt | 562 ++ .../contextlib2-0.6.0.dist-info/INSTALLER | 1 + .../contextlib2-0.6.0.dist-info/LICENSE.txt | 20 + .../contextlib2-0.6.0.dist-info/METADATA | 70 + .../contextlib2-0.6.0.dist-info/RECORD | 11 + .../contextlib2-0.6.0.dist-info/WHEEL | 6 + .../contextlib2-0.6.0.dist-info/top_level.txt | 1 + .../contextlib2-0.6.0.virtualenv | 0 .../python3.8/site-packages/contextlib2.py | 518 ++ .../distlib-0.3.0.dist-info/AUTHORS.txt | 562 ++ .../distlib-0.3.0.dist-info/INSTALLER | 1 + .../distlib-0.3.0.dist-info/LICENSE.txt | 20 + .../distlib-0.3.0.dist-info/METADATA | 31 + .../distlib-0.3.0.dist-info/RECORD | 48 + .../distlib-0.3.0.dist-info/WHEEL | 6 + .../distlib-0.3.0.dist-info/top_level.txt | 1 + .../site-packages/distlib-0.3.0.virtualenv | 0 .../site-packages/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1064 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 0 -> 32213 bytes .../__pycache__/resources.cpython-38.pyc | Bin 0 -> 11014 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 0 -> 10879 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 0 -> 48167 bytes .../distlib/_backport/__init__.py | 6 + .../site-packages/distlib/_backport/misc.py | 41 + .../site-packages/distlib/_backport/shutil.py | 761 ++ .../distlib/_backport/sysconfig.cfg | 84 + .../distlib/_backport/sysconfig.py | 786 ++ .../distlib/_backport/tarfile.py | 2607 ++++++ .../python3.8/site-packages/distlib/compat.py | 1120 +++ .../site-packages/distlib/database.py | 1339 +++ .../python3.8/site-packages/distlib/index.py | 516 ++ .../site-packages/distlib/locators.py | 1302 +++ .../site-packages/distlib/manifest.py | 393 + .../site-packages/distlib/markers.py | 131 + .../site-packages/distlib/metadata.py | 1096 +++ .../site-packages/distlib/resources.py | 355 + .../site-packages/distlib/scripts.py | 416 + .../python3.8/site-packages/distlib/util.py | 1761 ++++ .../site-packages/distlib/version.py | 736 ++ .../python3.8/site-packages/distlib/wheel.py | 1004 ++ .../distro-1.4.0.dist-info/AUTHORS.txt | 562 ++ .../distro-1.4.0.dist-info/INSTALLER | 1 + .../distro-1.4.0.dist-info/LICENSE.txt | 20 + .../distro-1.4.0.dist-info/METADATA | 170 + .../distro-1.4.0.dist-info/RECORD | 15 + .../distro-1.4.0.dist-info/WHEEL | 6 + .../distro-1.4.0.dist-info/entry_points.txt | 3 + .../distro-1.4.0.dist-info/top_level.txt | 1 + .../site-packages/distro-1.4.0.virtualenv | 0 .../lib/python3.8/site-packages/distro.py | 1216 +++ .../python3.8/site-packages/easy_install.py | 5 + .../html5lib-1.0.1.dist-info/AUTHORS.txt | 562 ++ .../html5lib-1.0.1.dist-info/INSTALLER | 1 + .../html5lib-1.0.1.dist-info/LICENSE.txt | 20 + .../html5lib-1.0.1.dist-info/METADATA | 526 ++ .../html5lib-1.0.1.dist-info/RECORD | 83 + .../html5lib-1.0.1.dist-info/WHEEL | 6 + .../html5lib-1.0.1.dist-info/top_level.txt | 1 + .../site-packages/html5lib-1.0.1.virtualenv | 0 .../site-packages/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1305 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 0 -> 13794 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 0 -> 21886 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 0 -> 39652 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 0 -> 3340 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 66359 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 0 -> 95169 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 10818 bytes .../site-packages/html5lib/_ihatexml.py | 288 + .../site-packages/html5lib/_inputstream.py | 923 ++ .../site-packages/html5lib/_tokenizer.py | 1721 ++++ .../site-packages/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 431 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 0 -> 1536 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 0 -> 2031 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 0 -> 2255 bytes .../site-packages/html5lib/_trie/_base.py | 37 + .../site-packages/html5lib/_trie/datrie.py | 44 + .../site-packages/html5lib/_trie/py.py | 67 + .../site-packages/html5lib/_utils.py | 124 + .../site-packages/html5lib/constants.py | 2947 ++++++ .../html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../site-packages/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../site-packages/html5lib/filters/lint.py | 93 + .../html5lib/filters/optionaltags.py | 207 + .../html5lib/filters/sanitizer.py | 896 ++ .../html5lib/filters/whitespace.py | 38 + .../site-packages/html5lib/html5parser.py | 2791 ++++++ .../site-packages/html5lib/serializer.py | 409 + .../html5lib/treeadapters/__init__.py | 30 + .../html5lib/treeadapters/genshi.py | 54 + .../html5lib/treeadapters/sax.py | 50 + .../html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3330 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 11344 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 11838 bytes .../html5lib/treebuilders/base.py | 417 + .../html5lib/treebuilders/dom.py | 236 + .../html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4011 bytes .../html5lib/treewalkers/base.py | 252 + .../site-packages/html5lib/treewalkers/dom.py | 43 + .../html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../html5lib/treewalkers/genshi.py | 69 + .../idna-2.8.dist-info/AUTHORS.txt | 562 ++ .../idna-2.8.dist-info/INSTALLER | 1 + .../idna-2.8.dist-info/LICENSE.txt | 20 + .../site-packages/idna-2.8.dist-info/METADATA | 239 + .../site-packages/idna-2.8.dist-info/RECORD | 26 + .../site-packages/idna-2.8.dist-info/WHEEL | 6 + .../idna-2.8.dist-info/top_level.txt | 1 + .../site-packages/idna-2.8.virtualenv | 0 .../python3.8/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 263 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9051 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21387 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1815 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 0 -> 217 bytes .../lib/python3.8/site-packages/idna/codec.py | 118 + .../python3.8/site-packages/idna/compat.py | 12 + .../lib/python3.8/site-packages/idna/core.py | 396 + .../python3.8/site-packages/idna/idnadata.py | 1979 ++++ .../python3.8/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + .../python3.8/site-packages/idna/uts46data.py | 8205 +++++++++++++++++ .../ipaddr-2.2.0.dist-info/AUTHORS.txt | 562 ++ .../ipaddr-2.2.0.dist-info/INSTALLER | 1 + .../ipaddr-2.2.0.dist-info/LICENSE.txt | 20 + .../ipaddr-2.2.0.dist-info/METADATA | 25 + .../ipaddr-2.2.0.dist-info/RECORD | 11 + .../ipaddr-2.2.0.dist-info/WHEEL | 6 + .../ipaddr-2.2.0.dist-info/top_level.txt | 1 + .../site-packages/ipaddr-2.2.0.virtualenv | 0 .../lib/python3.8/site-packages/ipaddr.py | 1928 ++++ .../lockfile-0.12.2.dist-info/AUTHORS.txt | 562 ++ .../lockfile-0.12.2.dist-info/INSTALLER | 1 + .../lockfile-0.12.2.dist-info/LICENSE.txt | 20 + .../lockfile-0.12.2.dist-info/METADATA | 58 + .../lockfile-0.12.2.dist-info/RECORD | 23 + .../lockfile-0.12.2.dist-info/WHEEL | 6 + .../lockfile-0.12.2.dist-info/pbr.json | 1 + .../lockfile-0.12.2.dist-info/top_level.txt | 1 + .../site-packages/lockfile-0.12.2.virtualenv | 0 .../site-packages/lockfile/__init__.py | 347 + .../site-packages/lockfile/linklockfile.py | 73 + .../site-packages/lockfile/mkdirlockfile.py | 84 + .../site-packages/lockfile/pidlockfile.py | 190 + .../site-packages/lockfile/sqlitelockfile.py | 156 + .../site-packages/lockfile/symlinklockfile.py | 70 + .../msgpack-0.6.2.dist-info/AUTHORS.txt | 562 ++ .../msgpack-0.6.2.dist-info/INSTALLER | 1 + .../msgpack-0.6.2.dist-info/LICENSE.txt | 20 + .../msgpack-0.6.2.dist-info/METADATA | 362 + .../msgpack-0.6.2.dist-info/RECORD | 19 + .../msgpack-0.6.2.dist-info/WHEEL | 6 + .../msgpack-0.6.2.dist-info/top_level.txt | 1 + .../site-packages/msgpack-0.6.2.virtualenv | 0 .../site-packages/msgpack/__init__.py | 65 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1960 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 224 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1858 bytes .../_cmsgpack.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 163216 bytes .../site-packages/msgpack/_version.py | 1 + .../site-packages/msgpack/exceptions.py | 48 + .../site-packages/msgpack/fallback.py | 1027 +++ .../packaging-20.3.dist-info/AUTHORS.txt | 562 ++ .../packaging-20.3.dist-info/INSTALLER | 1 + .../packaging-20.3.dist-info/LICENSE.txt | 20 + .../packaging-20.3.dist-info/METADATA | 362 + .../packaging-20.3.dist-info/RECORD | 33 + .../packaging-20.3.dist-info/WHEEL | 6 + .../packaging-20.3.dist-info/top_level.txt | 1 + .../site-packages/packaging-20.3.virtualenv | 0 .../site-packages/packaging/__about__.py | 27 + .../site-packages/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 739 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 577 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1154 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2903 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 0 -> 1482 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 9322 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 4085 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 20332 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 16906 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1571 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 13346 bytes .../site-packages/packaging/_compat.py | 38 + .../site-packages/packaging/_structures.py | 86 + .../site-packages/packaging/_typing.py | 39 + .../site-packages/packaging/markers.py | 328 + .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 145 + .../site-packages/packaging/specifiers.py | 849 ++ .../python3.8/site-packages/packaging/tags.py | 739 ++ .../site-packages/packaging/utils.py | 62 + .../site-packages/packaging/version.py | 535 ++ .../pbr-1.8.1.dist-info/DESCRIPTION.rst | 44 + .../pbr-1.8.1.dist-info/INSTALLER | 1 + .../pbr-1.8.1.dist-info/METADATA | 68 + .../site-packages/pbr-1.8.1.dist-info/RECORD | 101 + .../site-packages/pbr-1.8.1.dist-info/WHEEL | 6 + .../pbr-1.8.1.dist-info/entry_points.txt | 12 + .../pbr-1.8.1.dist-info/metadata.json | 1 + .../pbr-1.8.1.dist-info/top_level.txt | 1 + .../python3.8/site-packages/pbr/__init__.py | 0 .../pbr/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 139 bytes .../pbr/__pycache__/builddoc.cpython-38.pyc | Bin 0 -> 6235 bytes .../pbr/__pycache__/core.cpython-38.pyc | Bin 0 -> 2878 bytes .../__pycache__/extra_files.cpython-38.pyc | Bin 0 -> 634 bytes .../__pycache__/find_package.cpython-38.pyc | Bin 0 -> 714 bytes .../pbr/__pycache__/git.cpython-38.pyc | Bin 0 -> 7789 bytes .../pbr/__pycache__/options.cpython-38.pyc | Bin 0 -> 419 bytes .../pbr/__pycache__/packaging.cpython-38.pyc | Bin 0 -> 19337 bytes .../pbr/__pycache__/pbr_json.cpython-38.pyc | Bin 0 -> 621 bytes .../__pycache__/testr_command.cpython-38.pyc | Bin 0 -> 4452 bytes .../pbr/__pycache__/util.cpython-38.pyc | Bin 0 -> 14159 bytes .../pbr/__pycache__/version.cpython-38.pyc | Bin 0 -> 14731 bytes .../python3.8/site-packages/pbr/builddoc.py | 230 + .../site-packages/pbr/cmd/__init__.py | 0 .../cmd/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 143 bytes .../pbr/cmd/__pycache__/main.cpython-38.pyc | Bin 0 -> 2646 bytes .../python3.8/site-packages/pbr/cmd/main.py | 110 + .../lib/python3.8/site-packages/pbr/core.py | 154 + .../site-packages/pbr/extra_files.py | 35 + .../site-packages/pbr/find_package.py | 29 + .../lib/python3.8/site-packages/pbr/git.py | 294 + .../site-packages/pbr/hooks/__init__.py | 28 + .../hooks/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 642 bytes .../__pycache__/backwards.cpython-38.pyc | Bin 0 -> 821 bytes .../pbr/hooks/__pycache__/base.cpython-38.pyc | Bin 0 -> 931 bytes .../hooks/__pycache__/commands.cpython-38.pyc | Bin 0 -> 2014 bytes .../hooks/__pycache__/files.cpython-38.pyc | Bin 0 -> 3110 bytes .../hooks/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 840 bytes .../site-packages/pbr/hooks/backwards.py | 33 + .../python3.8/site-packages/pbr/hooks/base.py | 34 + .../site-packages/pbr/hooks/commands.py | 66 + .../site-packages/pbr/hooks/files.py | 103 + .../site-packages/pbr/hooks/metadata.py | 32 + .../python3.8/site-packages/pbr/options.py | 53 + .../python3.8/site-packages/pbr/packaging.py | 677 ++ .../python3.8/site-packages/pbr/pbr_json.py | 34 + .../site-packages/pbr/testr_command.py | 156 + .../site-packages/pbr/tests/__init__.py | 26 + .../tests/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 530 bytes .../pbr/tests/__pycache__/base.cpython-38.pyc | Bin 0 -> 6142 bytes .../__pycache__/test_commands.cpython-38.pyc | Bin 0 -> 1341 bytes .../__pycache__/test_core.cpython-38.pyc | Bin 0 -> 4030 bytes .../__pycache__/test_files.cpython-38.pyc | Bin 0 -> 2084 bytes .../__pycache__/test_hooks.cpython-38.pyc | Bin 0 -> 2564 bytes .../test_integration.cpython-38.pyc | Bin 0 -> 6450 bytes .../__pycache__/test_packaging.cpython-38.pyc | Bin 0 -> 17094 bytes .../__pycache__/test_setup.cpython-38.pyc | Bin 0 -> 14316 bytes .../__pycache__/test_util.cpython-38.pyc | Bin 0 -> 1916 bytes .../__pycache__/test_version.cpython-38.pyc | Bin 0 -> 10912 bytes .../__pycache__/test_wsgi.cpython-38.pyc | Bin 0 -> 3773 bytes .../pbr/tests/__pycache__/util.cpython-38.pyc | Bin 0 -> 1013 bytes .../python3.8/site-packages/pbr/tests/base.py | 218 + .../site-packages/pbr/tests/test_commands.py | 66 + .../site-packages/pbr/tests/test_core.py | 147 + .../site-packages/pbr/tests/test_files.py | 78 + .../site-packages/pbr/tests/test_hooks.py | 100 + .../pbr/tests/test_integration.py | 226 + .../site-packages/pbr/tests/test_packaging.py | 515 ++ .../site-packages/pbr/tests/test_setup.py | 425 + .../site-packages/pbr/tests/test_util.py | 75 + .../site-packages/pbr/tests/test_version.py | 298 + .../site-packages/pbr/tests/test_wsgi.py | 171 + .../pbr/tests/testpackage/CHANGES.txt | 86 + .../pbr/tests/testpackage/LICENSE.txt | 29 + .../pbr/tests/testpackage/MANIFEST.in | 2 + .../pbr/tests/testpackage/README.txt | 148 + .../__pycache__/setup.cpython-38.pyc | Bin 0 -> 236 bytes .../pbr/tests/testpackage/data_files/a.txt | 0 .../pbr/tests/testpackage/data_files/b.txt | 0 .../pbr/tests/testpackage/data_files/c.rst | 0 .../pbr/tests/testpackage/extra-file.txt | 0 .../pbr/tests/testpackage/git-extra-file.txt | 0 .../testpackage/pbr_testpackage/__init__.py | 3 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 287 bytes .../__pycache__/_setup_hooks.cpython-38.pyc | Bin 0 -> 1117 bytes .../__pycache__/cmd.cpython-38.pyc | Bin 0 -> 668 bytes .../__pycache__/extra.cpython-38.pyc | Bin 0 -> 170 bytes .../__pycache__/wsgi.cpython-38.pyc | Bin 0 -> 793 bytes .../pbr_testpackage/_setup_hooks.py | 65 + .../tests/testpackage/pbr_testpackage/cmd.py | 26 + .../testpackage/pbr_testpackage/extra.py | 0 .../pbr_testpackage/package_data/1.txt | 0 .../pbr_testpackage/package_data/2.txt | 0 .../tests/testpackage/pbr_testpackage/wsgi.py | 31 + .../pbr/tests/testpackage/setup.cfg | 57 + .../pbr/tests/testpackage/setup.py | 22 + .../pbr/tests/testpackage/src/testext.c | 28 + .../tests/testpackage/test-requirements.txt | 1 + .../python3.8/site-packages/pbr/tests/util.py | 74 + .../lib/python3.8/site-packages/pbr/util.py | 682 ++ .../python3.8/site-packages/pbr/version.py | 473 + .../pep517-0.8.2.dist-info/AUTHORS.txt | 562 ++ .../pep517-0.8.2.dist-info/INSTALLER | 1 + .../pep517-0.8.2.dist-info/LICENSE.txt | 20 + .../pep517-0.8.2.dist-info/METADATA | 15 + .../pep517-0.8.2.dist-info/RECORD | 30 + .../pep517-0.8.2.dist-info/WHEEL | 6 + .../pep517-0.8.2.dist-info/top_level.txt | 1 + .../site-packages/pep517-0.8.2.virtualenv | 0 .../site-packages/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 288 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 0 -> 1055 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 0 -> 10554 bytes .../site-packages/pep517/_in_process.py | 280 + .../python3.8/site-packages/pep517/build.py | 124 + .../python3.8/site-packages/pep517/check.py | 203 + .../site-packages/pep517/colorlog.py | 115 + .../python3.8/site-packages/pep517/compat.py | 34 + .../site-packages/pep517/dirtools.py | 44 + .../site-packages/pep517/envbuild.py | 167 + .../python3.8/site-packages/pep517/meta.py | 92 + .../site-packages/pep517/wrappers.py | 308 + .../pip-20.0.2.dist-info/INSTALLER | 1 + .../pip-20.0.2.dist-info/LICENSE.txt | 20 + .../pip-20.0.2.dist-info/METADATA | 84 + .../site-packages/pip-20.0.2.dist-info/RECORD | 264 + .../site-packages/pip-20.0.2.dist-info/WHEEL | 6 + .../pip-20.0.2.dist-info/entry_points.txt | 5 + .../pip-20.0.2.dist-info/top_level.txt | 1 + .../site-packages/pip-20.0.2.virtualenv | 0 .../python3.8/site-packages/pip/__init__.py | 18 + .../python3.8/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 683 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 732 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 0 -> 7537 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 8754 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 10699 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 12536 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 0 -> 9952 bytes .../__pycache__/locations.cpython-38.pyc | Bin 0 -> 4546 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 3638 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 0 -> 3788 bytes .../self_outdated_check.cpython-38.pyc | Bin 0 -> 5547 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 0 -> 6753 bytes .../site-packages/pip/_internal/build_env.py | 221 + .../site-packages/pip/_internal/cache.py | 329 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 290 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 0 -> 5007 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 0 -> 5901 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 0 -> 20382 bytes .../command_context.cpython-38.pyc | Bin 0 -> 1365 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 0 -> 1460 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 0 -> 2213 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 0 -> 9031 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 0 -> 8343 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 419 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 226 + .../pip/_internal/cli/cmdoptions.py | 957 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 265 + .../pip/_internal/cli/req_command.py | 333 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 114 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2906 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 16715 bytes .../pip/_internal/commands/check.py | 45 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 142 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 727 ++ .../pip/_internal/commands/list.py | 315 + .../pip/_internal/commands/search.py | 145 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 82 + .../pip/_internal/commands/wheel.py | 197 + .../pip/_internal/configuration.py | 422 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 866 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 1982 bytes .../__pycache__/installed.cpython-38.pyc | Bin 0 -> 1262 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 0 -> 3525 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1614 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 244 bytes .../__pycache__/collector.cpython-38.pyc | Bin 0 -> 14210 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 0 -> 25803 bytes .../pip/_internal/index/collector.py | 544 ++ .../pip/_internal/index/package_finder.py | 1013 ++ .../pip/_internal/legacy_resolve.py | 430 + .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 278 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 0 -> 1475 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 0 -> 2470 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 0 -> 1200 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 0 -> 6713 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 0 -> 916 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 0 -> 3307 bytes .../selection_prefs.cpython-38.pyc | Bin 0 -> 1650 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 0 -> 3273 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 3236 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 227 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 114 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 107 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 266 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 0 -> 7032 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 0 -> 2745 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 4424 bytes .../__pycache__/session.cpython-38.pyc | Bin 0 -> 8905 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 0 -> 760 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 405 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 214 bytes .../__pycache__/check.cpython-38.pyc | Bin 0 -> 3710 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 0 -> 11216 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 220 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 1262 bytes .../metadata_legacy.cpython-38.pyc | Bin 0 -> 3322 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1360 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 0 -> 2621 bytes .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 122 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 265 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 278 bytes .../editable_legacy.cpython-38.pyc | Bin 0 -> 1356 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 0 -> 3102 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 14636 bytes .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 129 + .../pip/_internal/operations/install/wheel.py | 615 ++ .../pip/_internal/operations/prepare.py | 591 ++ .../site-packages/pip/_internal/pep425tags.py | 167 + .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2248 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 0 -> 10417 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 0 -> 12756 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 0 -> 21392 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 0 -> 6075 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 0 -> 4095 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 0 -> 17481 bytes .../pip/_internal/req/constructors.py | 436 + .../pip/_internal/req/req_file.py | 546 ++ .../pip/_internal/req/req_install.py | 830 ++ .../pip/_internal/req/req_set.py | 209 + .../pip/_internal/req/req_tracker.py | 150 + .../pip/_internal/req/req_uninstall.py | 644 ++ .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 209 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 1393 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 0 -> 6174 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 0 -> 2880 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 0 -> 1193 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 1301 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 0 -> 4089 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 0 -> 610 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 0 -> 1762 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 0 -> 4198 bytes .../inject_securetransport.cpython-38.pyc | Bin 0 -> 986 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 0 -> 9213 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 0 -> 982 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 0 -> 23832 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 0 -> 1978 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 0 -> 2662 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 0 -> 1876 bytes .../setuptools_build.cpython-38.pyc | Bin 0 -> 2981 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 0 -> 5652 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 0 -> 6765 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 0 -> 1491 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 0 -> 11856 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 0 -> 6129 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 0 -> 1519 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 0 -> 3334 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 6379 bytes .../pip/_internal/utils/appdirs.py | 41 + .../pip/_internal/utils/compat.py | 269 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 171 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 131 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 398 + .../pip/_internal/utils/marker_files.py | 25 + .../site-packages/pip/_internal/utils/misc.py | 904 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 278 + .../pip/_internal/utils/temp_dir.py | 250 + .../pip/_internal/utils/typing.py | 38 + .../site-packages/pip/_internal/utils/ui.py | 428 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 54 + .../pip/_internal/utils/virtualenv.py | 115 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 502 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 0 -> 3801 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 0 -> 9552 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 0 -> 4942 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 0 -> 8541 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 0 -> 19270 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 389 + .../pip/_internal/vcs/mercurial.py | 155 + .../pip/_internal/vcs/subversion.py | 333 + .../pip/_internal/vcs/versioncontrol.py | 700 ++ .../pip/_internal/wheel_builder.py | 305 + .../site-packages/pip/_vendor/__init__.py | 117 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3017 bytes .../pkg_resources-0.0.0.dist-info/AUTHORS.txt | 562 ++ .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/LICENSE.txt | 20 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 44 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../pkg_resources-0.0.0.virtualenv | 0 .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 100410 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 654 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 211 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20564 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201688 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24484 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 761 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 599 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2817 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8973 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3932 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19841 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 10688 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2460 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../progress-1.5.dist-info/AUTHORS.txt | 562 ++ .../progress-1.5.dist-info/INSTALLER | 1 + .../progress-1.5.dist-info/LICENSE.txt | 20 + .../progress-1.5.dist-info/METADATA | 173 + .../progress-1.5.dist-info/RECORD | 18 + .../progress-1.5.dist-info/WHEEL | 6 + .../progress-1.5.dist-info/top_level.txt | 1 + .../site-packages/progress-1.5.virtualenv | 0 .../site-packages/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5623 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 0 -> 2647 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 0 -> 1406 bytes .../python3.8/site-packages/progress/bar.py | 91 + .../site-packages/progress/counter.py | 41 + .../site-packages/progress/spinner.py | 43 + .../pyparsing-2.4.6.dist-info/AUTHORS.txt | 562 ++ .../pyparsing-2.4.6.dist-info/INSTALLER | 1 + .../pyparsing-2.4.6.dist-info/LICENSE.txt | 20 + .../pyparsing-2.4.6.dist-info/METADATA | 104 + .../pyparsing-2.4.6.dist-info/RECORD | 11 + .../pyparsing-2.4.6.dist-info/WHEEL | 6 + .../pyparsing-2.4.6.dist-info/top_level.txt | 1 + .../site-packages/pyparsing-2.4.6.virtualenv | 0 .../lib/python3.8/site-packages/pyparsing.py | 7090 ++++++++++++++ .../pytoml-0.1.21.dist-info/AUTHORS.txt | 562 ++ .../pytoml-0.1.21.dist-info/INSTALLER | 1 + .../pytoml-0.1.21.dist-info/LICENSE.txt | 20 + .../pytoml-0.1.21.dist-info/METADATA | 69 + .../pytoml-0.1.21.dist-info/RECORD | 22 + .../pytoml-0.1.21.dist-info/WHEEL | 6 + .../pytoml-0.1.21.dist-info/top_level.txt | 1 + .../site-packages/pytoml-0.1.21.virtualenv | 0 .../site-packages/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 382 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 0 -> 959 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 10124 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 0 -> 1261 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2171 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 0 -> 3747 bytes .../python3.8/site-packages/pytoml/core.py | 13 + .../python3.8/site-packages/pytoml/parser.py | 342 + .../python3.8/site-packages/pytoml/test.py | 30 + .../python3.8/site-packages/pytoml/utils.py | 67 + .../python3.8/site-packages/pytoml/writer.py | 114 + .../requests-2.22.0.dist-info/AUTHORS.txt | 562 ++ .../requests-2.22.0.dist-info/INSTALLER | 1 + .../requests-2.22.0.dist-info/LICENSE.txt | 20 + .../requests-2.22.0.dist-info/METADATA | 141 + .../requests-2.22.0.dist-info/RECORD | 46 + .../requests-2.22.0.dist-info/WHEEL | 6 + .../requests-2.22.0.dist-info/top_level.txt | 1 + .../site-packages/requests-2.22.0.virtualenv | 0 .../site-packages/requests/__init__.py | 131 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3386 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 0 -> 556 bytes .../_internal_utils.cpython-38.pyc | Bin 0 -> 1326 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 0 -> 16917 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 0 -> 6513 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 0 -> 8335 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 0 -> 627 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 1661 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 0 -> 18840 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5238 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 0 -> 998 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 23862 bytes .../__pycache__/packages.cpython-38.pyc | Bin 0 -> 415 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 0 -> 19548 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 4194 bytes .../__pycache__/structures.cpython-38.pyc | Bin 0 -> 4436 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22205 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 533 ++ .../python3.8/site-packages/requests/api.py | 158 + .../python3.8/site-packages/requests/auth.py | 305 + .../python3.8/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 70 + .../site-packages/requests/cookies.py | 549 ++ .../site-packages/requests/exceptions.py | 126 + .../python3.8/site-packages/requests/help.py | 119 + .../python3.8/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 953 ++ .../site-packages/requests/packages.py | 14 + .../site-packages/requests/sessions.py | 770 ++ .../site-packages/requests/status_codes.py | 120 + .../site-packages/requests/structures.py | 103 + .../python3.8/site-packages/requests/utils.py | 977 ++ .../retrying-1.3.3.dist-info/AUTHORS.txt | 562 ++ .../retrying-1.3.3.dist-info/INSTALLER | 1 + .../retrying-1.3.3.dist-info/LICENSE.txt | 20 + .../retrying-1.3.3.dist-info/METADATA | 236 + .../retrying-1.3.3.dist-info/RECORD | 11 + .../retrying-1.3.3.dist-info/WHEEL | 6 + .../retrying-1.3.3.dist-info/top_level.txt | 1 + .../site-packages/retrying-1.3.3.virtualenv | 0 .../lib/python3.8/site-packages/retrying.py | 267 + .../setuptools-44.0.0.dist-info/AUTHORS.txt | 562 ++ .../setuptools-44.0.0.dist-info/INSTALLER | 1 + .../setuptools-44.0.0.dist-info/LICENSE.txt | 20 + .../setuptools-44.0.0.dist-info/METADATA | 82 + .../setuptools-44.0.0.dist-info/RECORD | 171 + .../setuptools-44.0.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-44.0.0.dist-info/top_level.txt | 3 + .../setuptools-44.0.0.dist-info/zip-safe | 1 + .../setuptools-44.0.0.virtualenv | 0 .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 7822 bytes .../_deprecation_warning.cpython-38.pyc | Bin 0 -> 570 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 0 -> 1944 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 0 -> 5182 bytes .../__pycache__/config.cpython-38.pyc | Bin 0 -> 17950 bytes .../__pycache__/depends.cpython-38.pyc | Bin 0 -> 5270 bytes .../__pycache__/dist.cpython-38.pyc | Bin 0 -> 42380 bytes .../__pycache__/extension.cpython-38.pyc | Bin 0 -> 2015 bytes .../__pycache__/glob.cpython-38.pyc | Bin 0 -> 3787 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 0 -> 2465 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 0 -> 4698 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 0 -> 39685 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 0 -> 3670 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 0 -> 33024 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 0 -> 1803 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 0 -> 1462 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 0 -> 504 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 15590 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 0 -> 6909 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 0 -> 1205 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 346 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 7437 bytes .../windows_support.cpython-38.pyc | Bin 0 -> 1043 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 73 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 208 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 0 -> 16466 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24481 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 758 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 596 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2814 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19788 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 10865 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1489 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 12119 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 257 + .../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-38.pyc | Bin 0 -> 766 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 0 -> 14236 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 0 -> 9949 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 0 -> 8695 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 0 -> 66748 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 0 -> 21827 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 4070 bytes .../install_egg_info.cpython-38.pyc | Bin 0 -> 2954 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 0 -> 5137 bytes .../install_scripts.cpython-38.pyc | Bin 0 -> 2327 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 0 -> 4664 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 0 -> 7913 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 0 -> 4591 bytes .../command/__pycache__/test.cpython-38.pyc | Bin 0 -> 8529 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2402 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 147 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 279 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1274 +++ .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2474 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 220 + .../setuptools/windows_support.py | 29 + .../simplejson-3.17.2.dist-info/INSTALLER | 1 + .../simplejson-3.17.2.dist-info/LICENSE.txt | 79 + .../simplejson-3.17.2.dist-info/METADATA | 71 + .../simplejson-3.17.2.dist-info/RECORD | 87 + .../simplejson-3.17.2.dist-info/WHEEL | 5 + .../simplejson-3.17.2.dist-info/top_level.txt | 1 + .../site-packages/simplejson/__init__.py | 584 ++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 20525 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 934 bytes .../__pycache__/decoder.cpython-38.pyc | Bin 0 -> 10576 bytes .../__pycache__/encoder.cpython-38.pyc | Bin 0 -> 18765 bytes .../__pycache__/errors.cpython-38.pyc | Bin 0 -> 2001 bytes .../__pycache__/ordered_dict.cpython-38.pyc | Bin 0 -> 3865 bytes .../__pycache__/raw_json.cpython-38.pyc | Bin 0 -> 570 bytes .../__pycache__/scanner.cpython-38.pyc | Bin 0 -> 2260 bytes .../__pycache__/tool.cpython-38.pyc | Bin 0 -> 1185 bytes .../_speedups.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 246376 bytes .../site-packages/simplejson/compat.py | 34 + .../site-packages/simplejson/decoder.py | 400 + .../site-packages/simplejson/encoder.py | 722 ++ .../site-packages/simplejson/errors.py | 53 + .../site-packages/simplejson/ordered_dict.py | 103 + .../site-packages/simplejson/raw_json.py | 9 + .../site-packages/simplejson/scanner.py | 85 + .../simplejson/tests/__init__.py | 74 + .../tests/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2748 bytes .../test_bigint_as_string.cpython-38.pyc | Bin 0 -> 1833 bytes .../test_bitsize_int_as_string.cpython-38.pyc | Bin 0 -> 2207 bytes .../test_check_circular.cpython-38.pyc | Bin 0 -> 1643 bytes .../__pycache__/test_decimal.cpython-38.pyc | Bin 0 -> 2674 bytes .../__pycache__/test_decode.cpython-38.pyc | Bin 0 -> 5445 bytes .../__pycache__/test_default.cpython-38.pyc | Bin 0 -> 597 bytes .../__pycache__/test_dump.cpython-38.pyc | Bin 0 -> 8693 bytes ...est_encode_basestring_ascii.cpython-38.pyc | Bin 0 -> 2309 bytes .../test_encode_for_html.cpython-38.pyc | Bin 0 -> 1844 bytes .../__pycache__/test_errors.cpython-38.pyc | Bin 0 -> 2391 bytes .../__pycache__/test_fail.cpython-38.pyc | Bin 0 -> 3871 bytes .../__pycache__/test_float.cpython-38.pyc | Bin 0 -> 1965 bytes .../__pycache__/test_for_json.cpython-38.pyc | Bin 0 -> 4632 bytes .../__pycache__/test_indent.cpython-38.pyc | Bin 0 -> 2281 bytes .../test_item_sort_key.cpython-38.pyc | Bin 0 -> 2062 bytes .../__pycache__/test_iterable.cpython-38.pyc | Bin 0 -> 1366 bytes .../test_namedtuple.cpython-38.pyc | Bin 0 -> 5069 bytes .../__pycache__/test_pass1.cpython-38.pyc | Bin 0 -> 2020 bytes .../__pycache__/test_pass2.cpython-38.pyc | Bin 0 -> 658 bytes .../__pycache__/test_pass3.cpython-38.pyc | Bin 0 -> 753 bytes .../__pycache__/test_raw_json.cpython-38.pyc | Bin 0 -> 1409 bytes .../__pycache__/test_recursion.cpython-38.pyc | Bin 0 -> 2038 bytes .../test_scanstring.cpython-38.pyc | Bin 0 -> 5108 bytes .../test_separators.cpython-38.pyc | Bin 0 -> 1252 bytes .../__pycache__/test_speedups.cpython-38.pyc | Bin 0 -> 4966 bytes .../test_str_subclass.cpython-38.pyc | Bin 0 -> 1069 bytes .../__pycache__/test_subclass.cpython-38.pyc | Bin 0 -> 1497 bytes .../__pycache__/test_tool.cpython-38.pyc | Bin 0 -> 3121 bytes .../__pycache__/test_tuple.cpython-38.pyc | Bin 0 -> 1386 bytes .../__pycache__/test_unicode.cpython-38.pyc | Bin 0 -> 6588 bytes .../simplejson/tests/test_bigint_as_string.py | 67 + .../tests/test_bitsize_int_as_string.py | 73 + .../simplejson/tests/test_check_circular.py | 30 + .../simplejson/tests/test_decimal.py | 71 + .../simplejson/tests/test_decode.py | 119 + .../simplejson/tests/test_default.py | 9 + .../simplejson/tests/test_dump.py | 249 + .../tests/test_encode_basestring_ascii.py | 47 + .../simplejson/tests/test_encode_for_html.py | 38 + .../simplejson/tests/test_errors.py | 68 + .../simplejson/tests/test_fail.py | 176 + .../simplejson/tests/test_float.py | 35 + .../simplejson/tests/test_for_json.py | 97 + .../simplejson/tests/test_indent.py | 86 + .../simplejson/tests/test_item_sort_key.py | 27 + .../simplejson/tests/test_iterable.py | 31 + .../simplejson/tests/test_namedtuple.py | 122 + .../simplejson/tests/test_pass1.py | 71 + .../simplejson/tests/test_pass2.py | 14 + .../simplejson/tests/test_pass3.py | 20 + .../simplejson/tests/test_raw_json.py | 47 + .../simplejson/tests/test_recursion.py | 67 + .../simplejson/tests/test_scanstring.py | 196 + .../simplejson/tests/test_separators.py | 42 + .../simplejson/tests/test_speedups.py | 114 + .../simplejson/tests/test_str_subclass.py | 21 + .../simplejson/tests/test_subclass.py | 37 + .../simplejson/tests/test_tool.py | 114 + .../simplejson/tests/test_tuple.py | 47 + .../simplejson/tests/test_unicode.py | 154 + .../site-packages/simplejson/tool.py | 42 + .../six-1.14.0.dist-info/AUTHORS.txt | 562 ++ .../six-1.14.0.dist-info/INSTALLER | 1 + .../six-1.14.0.dist-info/LICENSE.txt | 20 + .../six-1.14.0.dist-info/METADATA | 49 + .../site-packages/six-1.14.0.dist-info/RECORD | 11 + .../site-packages/six-1.14.0.dist-info/WHEEL | 6 + .../six-1.14.0.dist-info/top_level.txt | 1 + .../site-packages/six-1.14.0.virtualenv | 0 .tox/pep8/lib/python3.8/site-packages/six.py | 980 ++ .../urllib3-1.25.8.dist-info/AUTHORS.txt | 562 ++ .../urllib3-1.25.8.dist-info/INSTALLER | 1 + .../urllib3-1.25.8.dist-info/LICENSE.txt | 20 + .../urllib3-1.25.8.dist-info/METADATA | 1238 +++ .../urllib3-1.25.8.dist-info/RECORD | 86 + .../urllib3-1.25.8.dist-info/WHEEL | 6 + .../urllib3-1.25.8.dist-info/top_level.txt | 1 + .../site-packages/urllib3-1.25.8.virtualenv | 0 .../site-packages/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2127 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 0 -> 10672 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 10107 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 0 -> 24203 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 10056 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 0 -> 8115 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 0 -> 2741 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 0 -> 12916 bytes .../__pycache__/request.cpython-38.pyc | Bin 0 -> 5655 bytes .../__pycache__/response.cpython-38.pyc | Bin 0 -> 20357 bytes .../site-packages/urllib3/_collections.py | 336 + .../site-packages/urllib3/connection.py | 414 + .../site-packages/urllib3/connectionpool.py | 1053 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 205 bytes .../_appengine_environ.cpython-38.pyc | Bin 0 -> 1429 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 0 -> 3277 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 0 -> 14930 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 0 -> 5589 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 121 + .../urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../site-packages/urllib3/contrib/socks.py | 210 + .../site-packages/urllib3/exceptions.py | 255 + .../python3.8/site-packages/urllib3/fields.py | 273 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 420 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 52 + .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 560 bytes .../_implementation.cpython-38.pyc | Bin 0 -> 3317 bytes .../ssl_match_hostname/_implementation.py | 160 + .../site-packages/urllib3/poolmanager.py | 470 + .../site-packages/urllib3/request.py | 171 + .../site-packages/urllib3/response.py | 809 ++ .../site-packages/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1025 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 3198 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 0 -> 1035 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 0 -> 3355 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 0 -> 1982 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 0 -> 12966 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 0 -> 9834 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 0 -> 8885 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 0 -> 10688 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 0 -> 3119 bytes .../site-packages/urllib3/util/connection.py | 138 + .../site-packages/urllib3/util/queue.py | 21 + .../site-packages/urllib3/util/request.py | 135 + .../site-packages/urllib3/util/response.py | 86 + .../site-packages/urllib3/util/retry.py | 450 + .../site-packages/urllib3/util/ssl_.py | 407 + .../site-packages/urllib3/util/timeout.py | 258 + .../site-packages/urllib3/util/url.py | 430 + .../site-packages/urllib3/util/wait.py | 153 + .../webencodings-0.5.1.dist-info/AUTHORS.txt | 562 ++ .../webencodings-0.5.1.dist-info/INSTALLER | 1 + .../webencodings-0.5.1.dist-info/LICENSE.txt | 20 + .../webencodings-0.5.1.dist-info/METADATA | 54 + .../webencodings-0.5.1.dist-info/RECORD | 20 + .../webencodings-0.5.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../webencodings-0.5.1.virtualenv | 0 .../site-packages/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 9745 bytes .../__pycache__/labels.cpython-38.pyc | Bin 0 -> 3843 bytes .../site-packages/webencodings/labels.py | 231 + .../site-packages/webencodings/mklabels.py | 59 + .../site-packages/webencodings/tests.py | 153 + .../webencodings/x_user_defined.py | 325 + .../wheel-0.34.2.dist-info/AUTHORS.txt | 562 ++ .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/LICENSE.txt | 20 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/RECORD | 43 + .../wheel-0.34.2.dist-info/WHEEL | 6 + .../wheel-0.34.2.dist-info/entry_points.txt | 6 + .../wheel-0.34.2.dist-info/top_level.txt | 1 + .../site-packages/wheel-0.34.2.virtualenv | 0 .../python3.8/site-packages/wheel/__init__.py | 1 + .../python3.8/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 217 bytes .../__pycache__/bdist_wheel.cpython-38.pyc | Bin 0 -> 10923 bytes .../__pycache__/macosx_libfile.cpython-38.pyc | Bin 0 -> 7144 bytes .../wheel/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 3753 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 7641 bytes .../wheel/__pycache__/pkginfo.cpython-38.pyc | Bin 0 -> 1578 bytes .../wheel/__pycache__/util.cpython-38.pyc | Bin 0 -> 1331 bytes .../__pycache__/wheelfile.cpython-38.pyc | Bin 0 -> 5549 bytes .../python3.8/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3101 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.8/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + .../python3.8/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + .../python3.8/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.8/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + .tox/pep8/log/.lock | 0 .tox/pep8/log/pep8-0.log | 7 + .tox/pep8/log/pep8-1.log | 465 + .tox/pep8/pyvenv.cfg | 8 + .tox/py38/bin/activate | 84 + .tox/py38/bin/activate.csh | 55 + .tox/py38/bin/activate.fish | 100 + .tox/py38/bin/activate.ps1 | 60 + .tox/py38/bin/activate.xsh | 46 + .tox/py38/bin/activate_this.py | 32 + .tox/py38/bin/chardetect | 8 + .tox/py38/bin/chardetect-3.8 | 8 + .tox/py38/bin/chardetect3 | 8 + .tox/py38/bin/distro | 8 + .tox/py38/bin/distro-3.8 | 8 + .tox/py38/bin/distro3 | 8 + .tox/py38/bin/easy_install | 8 + .tox/py38/bin/easy_install-3.8 | 8 + .tox/py38/bin/easy_install3 | 8 + .tox/py38/bin/pbr | 8 + .tox/py38/bin/pip | 8 + .tox/py38/bin/pip-3.8 | 8 + .tox/py38/bin/pip3 | 8 + .tox/py38/bin/pip3.8 | 8 + .tox/py38/bin/python | 1 + .tox/py38/bin/python3 | 1 + .tox/py38/bin/python3.8 | 1 + .tox/py38/bin/wheel | 8 + .tox/py38/bin/wheel-3.8 | 8 + .tox/py38/bin/wheel3 | 8 + .../CacheControl-0.12.6.dist-info/AUTHORS.txt | 562 ++ .../CacheControl-0.12.6.dist-info/INSTALLER | 1 + .../CacheControl-0.12.6.dist-info/LICENSE.txt | 20 + .../CacheControl-0.12.6.dist-info/METADATA | 71 + .../CacheControl-0.12.6.dist-info/RECORD | 37 + .../CacheControl-0.12.6.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../CacheControl-0.12.6.virtualenv | 0 .../__pycache__/_virtualenv.cpython-38.pyc | Bin 0 -> 3991 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20542 bytes .../__pycache__/contextlib2.cpython-38.pyc | Bin 0 -> 15532 bytes .../__pycache__/distro.cpython-38.pyc | Bin 0 -> 36583 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 240354 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 0 -> 8024 bytes .../__pycache__/six.cpython-38.pyc | Bin 0 -> 26906 bytes .../python3.8/site-packages/_virtualenv.pth | 1 + .../python3.8/site-packages/_virtualenv.py | 115 + .../appdirs-1.4.3.dist-info/AUTHORS.txt | 562 ++ .../appdirs-1.4.3.dist-info/INSTALLER | 1 + .../appdirs-1.4.3.dist-info/LICENSE.txt | 20 + .../appdirs-1.4.3.dist-info/METADATA | 256 + .../appdirs-1.4.3.dist-info/RECORD | 11 + .../appdirs-1.4.3.dist-info/WHEEL | 6 + .../appdirs-1.4.3.dist-info/top_level.txt | 1 + .../site-packages/appdirs-1.4.3.virtualenv | 0 .../lib/python3.8/site-packages/appdirs.py | 608 ++ .../site-packages/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 555 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 0 -> 3077 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 1788 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 714 bytes .../__pycache__/controller.cpython-38.pyc | Bin 0 -> 7781 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 0 -> 2181 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 0 -> 4206 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 0 -> 679 bytes .../site-packages/cachecontrol/_cmd.py | 57 + .../site-packages/cachecontrol/adapter.py | 133 + .../site-packages/cachecontrol/cache.py | 39 + .../cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 299 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 0 -> 3273 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 0 -> 1559 bytes .../cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../site-packages/cachecontrol/compat.py | 29 + .../site-packages/cachecontrol/controller.py | 376 + .../site-packages/cachecontrol/filewrapper.py | 80 + .../site-packages/cachecontrol/heuristics.py | 135 + .../site-packages/cachecontrol/serialize.py | 188 + .../site-packages/cachecontrol/wrapper.py | 29 + .../certifi-2019.11.28.dist-info/AUTHORS.txt | 562 ++ .../certifi-2019.11.28.dist-info/INSTALLER | 1 + .../certifi-2019.11.28.dist-info/LICENSE.txt | 20 + .../certifi-2019.11.28.dist-info/METADATA | 74 + .../certifi-2019.11.28.dist-info/RECORD | 17 + .../certifi-2019.11.28.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../certifi-2019.11.28.virtualenv | 0 .../site-packages/certifi/__init__.py | 3 + .../site-packages/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 262 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 0 -> 486 bytes .../site-packages/certifi/cacert.pem | 4602 +++++++++ .../python3.8/site-packages/certifi/core.py | 15 + .../chardet-3.0.4.dist-info/AUTHORS.txt | 562 ++ .../chardet-3.0.4.dist-info/INSTALLER | 1 + .../chardet-3.0.4.dist-info/LICENSE.txt | 20 + .../chardet-3.0.4.dist-info/METADATA | 98 + .../chardet-3.0.4.dist-info/RECORD | 97 + .../chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + .../site-packages/chardet-3.0.4.virtualenv | 0 .../site-packages/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 855 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27184 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1139 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6225 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2256 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3488 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2915 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 360 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1146 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2653 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2638 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7479 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2456 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12068 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1147 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27188 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1147 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19112 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1155 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 3028 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22140 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37613 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23637 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29101 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23595 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22222 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22201 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22224 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3408 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2271 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1136 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16759 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 3024 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1634 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2492 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5836 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 1997 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 444 bytes .../site-packages/chardet/big5freq.py | 386 + .../site-packages/chardet/big5prober.py | 47 + .../site-packages/chardet/chardistribution.py | 233 + .../chardet/charsetgroupprober.py | 106 + .../site-packages/chardet/charsetprober.py | 145 + .../site-packages/chardet/cli/__init__.py | 1 + .../site-packages/chardet/cli/chardetect.py | 85 + .../chardet/codingstatemachine.py | 88 + .../python3.8/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + .../python3.8/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + .../python3.8/site-packages/chardet/escsm.py | 246 + .../site-packages/chardet/eucjpprober.py | 92 + .../site-packages/chardet/euckrfreq.py | 195 + .../site-packages/chardet/euckrprober.py | 47 + .../site-packages/chardet/euctwfreq.py | 387 + .../site-packages/chardet/euctwprober.py | 46 + .../site-packages/chardet/gb2312freq.py | 283 + .../site-packages/chardet/gb2312prober.py | 46 + .../site-packages/chardet/hebrewprober.py | 292 + .../site-packages/chardet/jisfreq.py | 325 + .../python3.8/site-packages/chardet/jpcntx.py | 233 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 333 + .../site-packages/chardet/langgreekmodel.py | 225 + .../site-packages/chardet/langhebrewmodel.py | 200 + .../chardet/langhungarianmodel.py | 225 + .../site-packages/chardet/langthaimodel.py | 199 + .../site-packages/chardet/langturkishmodel.py | 193 + .../site-packages/chardet/latin1prober.py | 145 + .../site-packages/chardet/mbcharsetprober.py | 91 + .../site-packages/chardet/mbcsgroupprober.py | 54 + .../python3.8/site-packages/chardet/mbcssm.py | 572 ++ .../site-packages/chardet/sbcharsetprober.py | 132 + .../site-packages/chardet/sbcsgroupprober.py | 73 + .../site-packages/chardet/sjisprober.py | 92 + .../chardet/universaldetector.py | 286 + .../site-packages/chardet/utf8prober.py | 82 + .../site-packages/chardet/version.py | 9 + .../colorama-0.4.3.dist-info/AUTHORS.txt | 562 ++ .../colorama-0.4.3.dist-info/INSTALLER | 1 + .../colorama-0.4.3.dist-info/LICENSE.txt | 20 + .../colorama-0.4.3.dist-info/METADATA | 411 + .../colorama-0.4.3.dist-info/RECORD | 22 + .../colorama-0.4.3.dist-info/WHEEL | 6 + .../colorama-0.4.3.dist-info/top_level.txt | 1 + .../site-packages/colorama-0.4.3.virtualenv | 0 .../site-packages/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 449 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 0 -> 3234 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 0 -> 7743 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 0 -> 1710 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 0 -> 3986 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 0 -> 4670 bytes .../python3.8/site-packages/colorama/ansi.py | 102 + .../site-packages/colorama/ansitowin32.py | 257 + .../site-packages/colorama/initialise.py | 80 + .../python3.8/site-packages/colorama/win32.py | 152 + .../site-packages/colorama/winterm.py | 169 + .../contextlib2-0.6.0.dist-info/AUTHORS.txt | 562 ++ .../contextlib2-0.6.0.dist-info/INSTALLER | 1 + .../contextlib2-0.6.0.dist-info/LICENSE.txt | 20 + .../contextlib2-0.6.0.dist-info/METADATA | 70 + .../contextlib2-0.6.0.dist-info/RECORD | 11 + .../contextlib2-0.6.0.dist-info/WHEEL | 6 + .../contextlib2-0.6.0.dist-info/top_level.txt | 1 + .../contextlib2-0.6.0.virtualenv | 0 .../python3.8/site-packages/contextlib2.py | 518 ++ .../distlib-0.3.0.dist-info/AUTHORS.txt | 562 ++ .../distlib-0.3.0.dist-info/INSTALLER | 1 + .../distlib-0.3.0.dist-info/LICENSE.txt | 20 + .../distlib-0.3.0.dist-info/METADATA | 31 + .../distlib-0.3.0.dist-info/RECORD | 48 + .../distlib-0.3.0.dist-info/WHEEL | 6 + .../distlib-0.3.0.dist-info/top_level.txt | 1 + .../site-packages/distlib-0.3.0.virtualenv | 0 .../site-packages/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1064 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 0 -> 32213 bytes .../__pycache__/resources.cpython-38.pyc | Bin 0 -> 11014 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 0 -> 10879 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 0 -> 48167 bytes .../distlib/_backport/__init__.py | 6 + .../site-packages/distlib/_backport/misc.py | 41 + .../site-packages/distlib/_backport/shutil.py | 761 ++ .../distlib/_backport/sysconfig.cfg | 84 + .../distlib/_backport/sysconfig.py | 786 ++ .../distlib/_backport/tarfile.py | 2607 ++++++ .../python3.8/site-packages/distlib/compat.py | 1120 +++ .../site-packages/distlib/database.py | 1339 +++ .../python3.8/site-packages/distlib/index.py | 516 ++ .../site-packages/distlib/locators.py | 1302 +++ .../site-packages/distlib/manifest.py | 393 + .../site-packages/distlib/markers.py | 131 + .../site-packages/distlib/metadata.py | 1096 +++ .../site-packages/distlib/resources.py | 355 + .../site-packages/distlib/scripts.py | 416 + .../python3.8/site-packages/distlib/util.py | 1761 ++++ .../site-packages/distlib/version.py | 736 ++ .../python3.8/site-packages/distlib/wheel.py | 1004 ++ .../distro-1.4.0.dist-info/AUTHORS.txt | 562 ++ .../distro-1.4.0.dist-info/INSTALLER | 1 + .../distro-1.4.0.dist-info/LICENSE.txt | 20 + .../distro-1.4.0.dist-info/METADATA | 170 + .../distro-1.4.0.dist-info/RECORD | 15 + .../distro-1.4.0.dist-info/WHEEL | 6 + .../distro-1.4.0.dist-info/entry_points.txt | 3 + .../distro-1.4.0.dist-info/top_level.txt | 1 + .../site-packages/distro-1.4.0.virtualenv | 0 .../lib/python3.8/site-packages/distro.py | 1216 +++ .../python3.8/site-packages/easy_install.py | 5 + .../html5lib-1.0.1.dist-info/AUTHORS.txt | 562 ++ .../html5lib-1.0.1.dist-info/INSTALLER | 1 + .../html5lib-1.0.1.dist-info/LICENSE.txt | 20 + .../html5lib-1.0.1.dist-info/METADATA | 526 ++ .../html5lib-1.0.1.dist-info/RECORD | 83 + .../html5lib-1.0.1.dist-info/WHEEL | 6 + .../html5lib-1.0.1.dist-info/top_level.txt | 1 + .../site-packages/html5lib-1.0.1.virtualenv | 0 .../site-packages/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1305 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 0 -> 13794 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 0 -> 21886 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 0 -> 39652 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 0 -> 3340 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 66359 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 0 -> 95169 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 10818 bytes .../site-packages/html5lib/_ihatexml.py | 288 + .../site-packages/html5lib/_inputstream.py | 923 ++ .../site-packages/html5lib/_tokenizer.py | 1721 ++++ .../site-packages/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 431 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 0 -> 1536 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 0 -> 2031 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 0 -> 2255 bytes .../site-packages/html5lib/_trie/_base.py | 37 + .../site-packages/html5lib/_trie/datrie.py | 44 + .../site-packages/html5lib/_trie/py.py | 67 + .../site-packages/html5lib/_utils.py | 124 + .../site-packages/html5lib/constants.py | 2947 ++++++ .../html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../site-packages/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../site-packages/html5lib/filters/lint.py | 93 + .../html5lib/filters/optionaltags.py | 207 + .../html5lib/filters/sanitizer.py | 896 ++ .../html5lib/filters/whitespace.py | 38 + .../site-packages/html5lib/html5parser.py | 2791 ++++++ .../site-packages/html5lib/serializer.py | 409 + .../html5lib/treeadapters/__init__.py | 30 + .../html5lib/treeadapters/genshi.py | 54 + .../html5lib/treeadapters/sax.py | 50 + .../html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3330 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 11344 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 11838 bytes .../html5lib/treebuilders/base.py | 417 + .../html5lib/treebuilders/dom.py | 236 + .../html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4011 bytes .../html5lib/treewalkers/base.py | 252 + .../site-packages/html5lib/treewalkers/dom.py | 43 + .../html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../html5lib/treewalkers/genshi.py | 69 + .../idna-2.8.dist-info/AUTHORS.txt | 562 ++ .../idna-2.8.dist-info/INSTALLER | 1 + .../idna-2.8.dist-info/LICENSE.txt | 20 + .../site-packages/idna-2.8.dist-info/METADATA | 239 + .../site-packages/idna-2.8.dist-info/RECORD | 26 + .../site-packages/idna-2.8.dist-info/WHEEL | 6 + .../idna-2.8.dist-info/top_level.txt | 1 + .../site-packages/idna-2.8.virtualenv | 0 .../python3.8/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 263 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9051 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21387 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1815 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 0 -> 217 bytes .../lib/python3.8/site-packages/idna/codec.py | 118 + .../python3.8/site-packages/idna/compat.py | 12 + .../lib/python3.8/site-packages/idna/core.py | 396 + .../python3.8/site-packages/idna/idnadata.py | 1979 ++++ .../python3.8/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + .../python3.8/site-packages/idna/uts46data.py | 8205 +++++++++++++++++ .../ipaddr-2.2.0.dist-info/AUTHORS.txt | 562 ++ .../ipaddr-2.2.0.dist-info/INSTALLER | 1 + .../ipaddr-2.2.0.dist-info/LICENSE.txt | 20 + .../ipaddr-2.2.0.dist-info/METADATA | 25 + .../ipaddr-2.2.0.dist-info/RECORD | 11 + .../ipaddr-2.2.0.dist-info/WHEEL | 6 + .../ipaddr-2.2.0.dist-info/top_level.txt | 1 + .../site-packages/ipaddr-2.2.0.virtualenv | 0 .../lib/python3.8/site-packages/ipaddr.py | 1928 ++++ .../lockfile-0.12.2.dist-info/AUTHORS.txt | 562 ++ .../lockfile-0.12.2.dist-info/INSTALLER | 1 + .../lockfile-0.12.2.dist-info/LICENSE.txt | 20 + .../lockfile-0.12.2.dist-info/METADATA | 58 + .../lockfile-0.12.2.dist-info/RECORD | 23 + .../lockfile-0.12.2.dist-info/WHEEL | 6 + .../lockfile-0.12.2.dist-info/pbr.json | 1 + .../lockfile-0.12.2.dist-info/top_level.txt | 1 + .../site-packages/lockfile-0.12.2.virtualenv | 0 .../site-packages/lockfile/__init__.py | 347 + .../site-packages/lockfile/linklockfile.py | 73 + .../site-packages/lockfile/mkdirlockfile.py | 84 + .../site-packages/lockfile/pidlockfile.py | 190 + .../site-packages/lockfile/sqlitelockfile.py | 156 + .../site-packages/lockfile/symlinklockfile.py | 70 + .../msgpack-0.6.2.dist-info/AUTHORS.txt | 562 ++ .../msgpack-0.6.2.dist-info/INSTALLER | 1 + .../msgpack-0.6.2.dist-info/LICENSE.txt | 20 + .../msgpack-0.6.2.dist-info/METADATA | 362 + .../msgpack-0.6.2.dist-info/RECORD | 19 + .../msgpack-0.6.2.dist-info/WHEEL | 6 + .../msgpack-0.6.2.dist-info/top_level.txt | 1 + .../site-packages/msgpack-0.6.2.virtualenv | 0 .../site-packages/msgpack/__init__.py | 65 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1960 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 224 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1858 bytes .../_cmsgpack.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 163216 bytes .../site-packages/msgpack/_version.py | 1 + .../site-packages/msgpack/exceptions.py | 48 + .../site-packages/msgpack/fallback.py | 1027 +++ .../packaging-20.3.dist-info/AUTHORS.txt | 562 ++ .../packaging-20.3.dist-info/INSTALLER | 1 + .../packaging-20.3.dist-info/LICENSE.txt | 20 + .../packaging-20.3.dist-info/METADATA | 362 + .../packaging-20.3.dist-info/RECORD | 33 + .../packaging-20.3.dist-info/WHEEL | 6 + .../packaging-20.3.dist-info/top_level.txt | 1 + .../site-packages/packaging-20.3.virtualenv | 0 .../site-packages/packaging/__about__.py | 27 + .../site-packages/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 739 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 577 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1154 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2903 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 0 -> 1482 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 9322 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 4085 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 20332 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 16906 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1571 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 13346 bytes .../site-packages/packaging/_compat.py | 38 + .../site-packages/packaging/_structures.py | 86 + .../site-packages/packaging/_typing.py | 39 + .../site-packages/packaging/markers.py | 328 + .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 145 + .../site-packages/packaging/specifiers.py | 849 ++ .../python3.8/site-packages/packaging/tags.py | 739 ++ .../site-packages/packaging/utils.py | 62 + .../site-packages/packaging/version.py | 535 ++ .../pbr-1.8.1.dist-info/DESCRIPTION.rst | 44 + .../pbr-1.8.1.dist-info/INSTALLER | 1 + .../pbr-1.8.1.dist-info/METADATA | 68 + .../site-packages/pbr-1.8.1.dist-info/RECORD | 101 + .../site-packages/pbr-1.8.1.dist-info/WHEEL | 6 + .../pbr-1.8.1.dist-info/entry_points.txt | 12 + .../pbr-1.8.1.dist-info/metadata.json | 1 + .../pbr-1.8.1.dist-info/top_level.txt | 1 + .../python3.8/site-packages/pbr/__init__.py | 0 .../pbr/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 139 bytes .../pbr/__pycache__/builddoc.cpython-38.pyc | Bin 0 -> 6235 bytes .../pbr/__pycache__/core.cpython-38.pyc | Bin 0 -> 2878 bytes .../__pycache__/extra_files.cpython-38.pyc | Bin 0 -> 634 bytes .../__pycache__/find_package.cpython-38.pyc | Bin 0 -> 714 bytes .../pbr/__pycache__/git.cpython-38.pyc | Bin 0 -> 7789 bytes .../pbr/__pycache__/options.cpython-38.pyc | Bin 0 -> 419 bytes .../pbr/__pycache__/packaging.cpython-38.pyc | Bin 0 -> 19337 bytes .../pbr/__pycache__/pbr_json.cpython-38.pyc | Bin 0 -> 621 bytes .../__pycache__/testr_command.cpython-38.pyc | Bin 0 -> 4452 bytes .../pbr/__pycache__/util.cpython-38.pyc | Bin 0 -> 14159 bytes .../pbr/__pycache__/version.cpython-38.pyc | Bin 0 -> 14731 bytes .../python3.8/site-packages/pbr/builddoc.py | 230 + .../site-packages/pbr/cmd/__init__.py | 0 .../cmd/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 143 bytes .../pbr/cmd/__pycache__/main.cpython-38.pyc | Bin 0 -> 2646 bytes .../python3.8/site-packages/pbr/cmd/main.py | 110 + .../lib/python3.8/site-packages/pbr/core.py | 154 + .../site-packages/pbr/extra_files.py | 35 + .../site-packages/pbr/find_package.py | 29 + .../lib/python3.8/site-packages/pbr/git.py | 294 + .../site-packages/pbr/hooks/__init__.py | 28 + .../hooks/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 642 bytes .../__pycache__/backwards.cpython-38.pyc | Bin 0 -> 821 bytes .../pbr/hooks/__pycache__/base.cpython-38.pyc | Bin 0 -> 931 bytes .../hooks/__pycache__/commands.cpython-38.pyc | Bin 0 -> 2014 bytes .../hooks/__pycache__/files.cpython-38.pyc | Bin 0 -> 3110 bytes .../hooks/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 840 bytes .../site-packages/pbr/hooks/backwards.py | 33 + .../python3.8/site-packages/pbr/hooks/base.py | 34 + .../site-packages/pbr/hooks/commands.py | 66 + .../site-packages/pbr/hooks/files.py | 103 + .../site-packages/pbr/hooks/metadata.py | 32 + .../python3.8/site-packages/pbr/options.py | 53 + .../python3.8/site-packages/pbr/packaging.py | 677 ++ .../python3.8/site-packages/pbr/pbr_json.py | 34 + .../site-packages/pbr/testr_command.py | 156 + .../site-packages/pbr/tests/__init__.py | 26 + .../tests/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 530 bytes .../pbr/tests/__pycache__/base.cpython-38.pyc | Bin 0 -> 6142 bytes .../__pycache__/test_commands.cpython-38.pyc | Bin 0 -> 1341 bytes .../__pycache__/test_core.cpython-38.pyc | Bin 0 -> 4030 bytes .../__pycache__/test_files.cpython-38.pyc | Bin 0 -> 2084 bytes .../__pycache__/test_hooks.cpython-38.pyc | Bin 0 -> 2564 bytes .../test_integration.cpython-38.pyc | Bin 0 -> 6450 bytes .../__pycache__/test_packaging.cpython-38.pyc | Bin 0 -> 17094 bytes .../__pycache__/test_setup.cpython-38.pyc | Bin 0 -> 14316 bytes .../__pycache__/test_util.cpython-38.pyc | Bin 0 -> 1916 bytes .../__pycache__/test_version.cpython-38.pyc | Bin 0 -> 10912 bytes .../__pycache__/test_wsgi.cpython-38.pyc | Bin 0 -> 3773 bytes .../pbr/tests/__pycache__/util.cpython-38.pyc | Bin 0 -> 1013 bytes .../python3.8/site-packages/pbr/tests/base.py | 218 + .../site-packages/pbr/tests/test_commands.py | 66 + .../site-packages/pbr/tests/test_core.py | 147 + .../site-packages/pbr/tests/test_files.py | 78 + .../site-packages/pbr/tests/test_hooks.py | 100 + .../pbr/tests/test_integration.py | 226 + .../site-packages/pbr/tests/test_packaging.py | 515 ++ .../site-packages/pbr/tests/test_setup.py | 425 + .../site-packages/pbr/tests/test_util.py | 75 + .../site-packages/pbr/tests/test_version.py | 298 + .../site-packages/pbr/tests/test_wsgi.py | 171 + .../pbr/tests/testpackage/CHANGES.txt | 86 + .../pbr/tests/testpackage/LICENSE.txt | 29 + .../pbr/tests/testpackage/MANIFEST.in | 2 + .../pbr/tests/testpackage/README.txt | 148 + .../__pycache__/setup.cpython-38.pyc | Bin 0 -> 236 bytes .../pbr/tests/testpackage/data_files/a.txt | 0 .../pbr/tests/testpackage/data_files/b.txt | 0 .../pbr/tests/testpackage/data_files/c.rst | 0 .../pbr/tests/testpackage/extra-file.txt | 0 .../pbr/tests/testpackage/git-extra-file.txt | 0 .../testpackage/pbr_testpackage/__init__.py | 3 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 287 bytes .../__pycache__/_setup_hooks.cpython-38.pyc | Bin 0 -> 1117 bytes .../__pycache__/cmd.cpython-38.pyc | Bin 0 -> 668 bytes .../__pycache__/extra.cpython-38.pyc | Bin 0 -> 170 bytes .../__pycache__/wsgi.cpython-38.pyc | Bin 0 -> 793 bytes .../pbr_testpackage/_setup_hooks.py | 65 + .../tests/testpackage/pbr_testpackage/cmd.py | 26 + .../testpackage/pbr_testpackage/extra.py | 0 .../pbr_testpackage/package_data/1.txt | 0 .../pbr_testpackage/package_data/2.txt | 0 .../tests/testpackage/pbr_testpackage/wsgi.py | 31 + .../pbr/tests/testpackage/setup.cfg | 57 + .../pbr/tests/testpackage/setup.py | 22 + .../pbr/tests/testpackage/src/testext.c | 28 + .../tests/testpackage/test-requirements.txt | 1 + .../python3.8/site-packages/pbr/tests/util.py | 74 + .../lib/python3.8/site-packages/pbr/util.py | 682 ++ .../python3.8/site-packages/pbr/version.py | 473 + .../pep517-0.8.2.dist-info/AUTHORS.txt | 562 ++ .../pep517-0.8.2.dist-info/INSTALLER | 1 + .../pep517-0.8.2.dist-info/LICENSE.txt | 20 + .../pep517-0.8.2.dist-info/METADATA | 15 + .../pep517-0.8.2.dist-info/RECORD | 30 + .../pep517-0.8.2.dist-info/WHEEL | 6 + .../pep517-0.8.2.dist-info/top_level.txt | 1 + .../site-packages/pep517-0.8.2.virtualenv | 0 .../site-packages/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 288 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 0 -> 1055 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 0 -> 10554 bytes .../site-packages/pep517/_in_process.py | 280 + .../python3.8/site-packages/pep517/build.py | 124 + .../python3.8/site-packages/pep517/check.py | 203 + .../site-packages/pep517/colorlog.py | 115 + .../python3.8/site-packages/pep517/compat.py | 34 + .../site-packages/pep517/dirtools.py | 44 + .../site-packages/pep517/envbuild.py | 167 + .../python3.8/site-packages/pep517/meta.py | 92 + .../site-packages/pep517/wrappers.py | 308 + .../pip-20.0.2.dist-info/INSTALLER | 1 + .../pip-20.0.2.dist-info/LICENSE.txt | 20 + .../pip-20.0.2.dist-info/METADATA | 84 + .../site-packages/pip-20.0.2.dist-info/RECORD | 264 + .../site-packages/pip-20.0.2.dist-info/WHEEL | 6 + .../pip-20.0.2.dist-info/entry_points.txt | 5 + .../pip-20.0.2.dist-info/top_level.txt | 1 + .../site-packages/pip-20.0.2.virtualenv | 0 .../python3.8/site-packages/pip/__init__.py | 18 + .../python3.8/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 683 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 732 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 0 -> 7537 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 8754 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 10699 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 12536 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 0 -> 9952 bytes .../__pycache__/locations.cpython-38.pyc | Bin 0 -> 4546 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 3638 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 0 -> 3788 bytes .../self_outdated_check.cpython-38.pyc | Bin 0 -> 5547 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 0 -> 6753 bytes .../site-packages/pip/_internal/build_env.py | 221 + .../site-packages/pip/_internal/cache.py | 329 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 290 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 0 -> 5007 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 0 -> 5901 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 0 -> 20382 bytes .../command_context.cpython-38.pyc | Bin 0 -> 1365 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 0 -> 1460 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 0 -> 2213 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 0 -> 9031 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 0 -> 8343 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 419 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 226 + .../pip/_internal/cli/cmdoptions.py | 957 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 265 + .../pip/_internal/cli/req_command.py | 333 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 114 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2906 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 16715 bytes .../pip/_internal/commands/check.py | 45 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 142 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 727 ++ .../pip/_internal/commands/list.py | 315 + .../pip/_internal/commands/search.py | 145 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 82 + .../pip/_internal/commands/wheel.py | 197 + .../pip/_internal/configuration.py | 422 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 866 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 1982 bytes .../__pycache__/installed.cpython-38.pyc | Bin 0 -> 1262 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 0 -> 3525 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1614 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 244 bytes .../__pycache__/collector.cpython-38.pyc | Bin 0 -> 14210 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 0 -> 25803 bytes .../pip/_internal/index/collector.py | 544 ++ .../pip/_internal/index/package_finder.py | 1013 ++ .../pip/_internal/legacy_resolve.py | 430 + .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 278 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 0 -> 1475 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 0 -> 2470 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 0 -> 1200 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 0 -> 6713 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 0 -> 916 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 0 -> 3307 bytes .../selection_prefs.cpython-38.pyc | Bin 0 -> 1650 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 0 -> 3273 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 3236 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 227 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 114 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 107 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 266 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 0 -> 7032 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 0 -> 2745 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 4424 bytes .../__pycache__/session.cpython-38.pyc | Bin 0 -> 8905 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 0 -> 760 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 405 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 214 bytes .../__pycache__/check.cpython-38.pyc | Bin 0 -> 3710 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 0 -> 11216 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 220 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 1262 bytes .../metadata_legacy.cpython-38.pyc | Bin 0 -> 3322 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1360 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 0 -> 2621 bytes .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 122 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 265 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 278 bytes .../editable_legacy.cpython-38.pyc | Bin 0 -> 1356 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 0 -> 3102 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 14636 bytes .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 129 + .../pip/_internal/operations/install/wheel.py | 615 ++ .../pip/_internal/operations/prepare.py | 591 ++ .../site-packages/pip/_internal/pep425tags.py | 167 + .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2248 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 0 -> 10417 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 0 -> 12756 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 0 -> 21392 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 0 -> 6075 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 0 -> 4095 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 0 -> 17481 bytes .../pip/_internal/req/constructors.py | 436 + .../pip/_internal/req/req_file.py | 546 ++ .../pip/_internal/req/req_install.py | 830 ++ .../pip/_internal/req/req_set.py | 209 + .../pip/_internal/req/req_tracker.py | 150 + .../pip/_internal/req/req_uninstall.py | 644 ++ .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 209 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 1393 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 0 -> 6174 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 0 -> 2880 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 0 -> 1193 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 1301 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 0 -> 4089 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 0 -> 610 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 0 -> 1762 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 0 -> 4198 bytes .../inject_securetransport.cpython-38.pyc | Bin 0 -> 986 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 0 -> 9213 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 0 -> 982 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 0 -> 23832 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 0 -> 1978 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 0 -> 2662 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 0 -> 1876 bytes .../setuptools_build.cpython-38.pyc | Bin 0 -> 2981 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 0 -> 5652 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 0 -> 6765 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 0 -> 1491 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 0 -> 11856 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 0 -> 6129 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 0 -> 1519 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 0 -> 3334 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 6379 bytes .../pip/_internal/utils/appdirs.py | 41 + .../pip/_internal/utils/compat.py | 269 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 171 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 131 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 398 + .../pip/_internal/utils/marker_files.py | 25 + .../site-packages/pip/_internal/utils/misc.py | 904 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 278 + .../pip/_internal/utils/temp_dir.py | 250 + .../pip/_internal/utils/typing.py | 38 + .../site-packages/pip/_internal/utils/ui.py | 428 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 54 + .../pip/_internal/utils/virtualenv.py | 115 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 502 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 0 -> 3801 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 0 -> 9552 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 0 -> 4942 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 0 -> 8541 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 0 -> 19270 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 389 + .../pip/_internal/vcs/mercurial.py | 155 + .../pip/_internal/vcs/subversion.py | 333 + .../pip/_internal/vcs/versioncontrol.py | 700 ++ .../pip/_internal/wheel_builder.py | 305 + .../site-packages/pip/_vendor/__init__.py | 117 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3017 bytes .../pkg_resources-0.0.0.dist-info/AUTHORS.txt | 562 ++ .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/LICENSE.txt | 20 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 44 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../pkg_resources-0.0.0.virtualenv | 0 .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 100410 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 654 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 211 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20564 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201688 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24484 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 761 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 599 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2817 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8973 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3932 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19841 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 10688 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2460 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../progress-1.5.dist-info/AUTHORS.txt | 562 ++ .../progress-1.5.dist-info/INSTALLER | 1 + .../progress-1.5.dist-info/LICENSE.txt | 20 + .../progress-1.5.dist-info/METADATA | 173 + .../progress-1.5.dist-info/RECORD | 18 + .../progress-1.5.dist-info/WHEEL | 6 + .../progress-1.5.dist-info/top_level.txt | 1 + .../site-packages/progress-1.5.virtualenv | 0 .../site-packages/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5623 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 0 -> 2647 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 0 -> 1406 bytes .../python3.8/site-packages/progress/bar.py | 91 + .../site-packages/progress/counter.py | 41 + .../site-packages/progress/spinner.py | 43 + .../pyparsing-2.4.6.dist-info/AUTHORS.txt | 562 ++ .../pyparsing-2.4.6.dist-info/INSTALLER | 1 + .../pyparsing-2.4.6.dist-info/LICENSE.txt | 20 + .../pyparsing-2.4.6.dist-info/METADATA | 104 + .../pyparsing-2.4.6.dist-info/RECORD | 11 + .../pyparsing-2.4.6.dist-info/WHEEL | 6 + .../pyparsing-2.4.6.dist-info/top_level.txt | 1 + .../site-packages/pyparsing-2.4.6.virtualenv | 0 .../lib/python3.8/site-packages/pyparsing.py | 7090 ++++++++++++++ .../pytoml-0.1.21.dist-info/AUTHORS.txt | 562 ++ .../pytoml-0.1.21.dist-info/INSTALLER | 1 + .../pytoml-0.1.21.dist-info/LICENSE.txt | 20 + .../pytoml-0.1.21.dist-info/METADATA | 69 + .../pytoml-0.1.21.dist-info/RECORD | 22 + .../pytoml-0.1.21.dist-info/WHEEL | 6 + .../pytoml-0.1.21.dist-info/top_level.txt | 1 + .../site-packages/pytoml-0.1.21.virtualenv | 0 .../site-packages/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 382 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 0 -> 959 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 10124 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 0 -> 1261 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2171 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 0 -> 3747 bytes .../python3.8/site-packages/pytoml/core.py | 13 + .../python3.8/site-packages/pytoml/parser.py | 342 + .../python3.8/site-packages/pytoml/test.py | 30 + .../python3.8/site-packages/pytoml/utils.py | 67 + .../python3.8/site-packages/pytoml/writer.py | 114 + .../requests-2.22.0.dist-info/AUTHORS.txt | 562 ++ .../requests-2.22.0.dist-info/INSTALLER | 1 + .../requests-2.22.0.dist-info/LICENSE.txt | 20 + .../requests-2.22.0.dist-info/METADATA | 141 + .../requests-2.22.0.dist-info/RECORD | 46 + .../requests-2.22.0.dist-info/WHEEL | 6 + .../requests-2.22.0.dist-info/top_level.txt | 1 + .../site-packages/requests-2.22.0.virtualenv | 0 .../site-packages/requests/__init__.py | 131 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3386 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 0 -> 556 bytes .../_internal_utils.cpython-38.pyc | Bin 0 -> 1326 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 0 -> 16917 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 0 -> 6513 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 0 -> 8335 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 0 -> 627 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 1661 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 0 -> 18840 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5238 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 0 -> 998 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 23862 bytes .../__pycache__/packages.cpython-38.pyc | Bin 0 -> 415 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 0 -> 19548 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 4194 bytes .../__pycache__/structures.cpython-38.pyc | Bin 0 -> 4436 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22205 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 533 ++ .../python3.8/site-packages/requests/api.py | 158 + .../python3.8/site-packages/requests/auth.py | 305 + .../python3.8/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 70 + .../site-packages/requests/cookies.py | 549 ++ .../site-packages/requests/exceptions.py | 126 + .../python3.8/site-packages/requests/help.py | 119 + .../python3.8/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 953 ++ .../site-packages/requests/packages.py | 14 + .../site-packages/requests/sessions.py | 770 ++ .../site-packages/requests/status_codes.py | 120 + .../site-packages/requests/structures.py | 103 + .../python3.8/site-packages/requests/utils.py | 977 ++ .../retrying-1.3.3.dist-info/AUTHORS.txt | 562 ++ .../retrying-1.3.3.dist-info/INSTALLER | 1 + .../retrying-1.3.3.dist-info/LICENSE.txt | 20 + .../retrying-1.3.3.dist-info/METADATA | 236 + .../retrying-1.3.3.dist-info/RECORD | 11 + .../retrying-1.3.3.dist-info/WHEEL | 6 + .../retrying-1.3.3.dist-info/top_level.txt | 1 + .../site-packages/retrying-1.3.3.virtualenv | 0 .../lib/python3.8/site-packages/retrying.py | 267 + .../setuptools-44.0.0.dist-info/AUTHORS.txt | 562 ++ .../setuptools-44.0.0.dist-info/INSTALLER | 1 + .../setuptools-44.0.0.dist-info/LICENSE.txt | 20 + .../setuptools-44.0.0.dist-info/METADATA | 82 + .../setuptools-44.0.0.dist-info/RECORD | 171 + .../setuptools-44.0.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-44.0.0.dist-info/top_level.txt | 3 + .../setuptools-44.0.0.dist-info/zip-safe | 1 + .../setuptools-44.0.0.virtualenv | 0 .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 7822 bytes .../_deprecation_warning.cpython-38.pyc | Bin 0 -> 570 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 0 -> 1944 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 0 -> 5182 bytes .../__pycache__/config.cpython-38.pyc | Bin 0 -> 17950 bytes .../__pycache__/depends.cpython-38.pyc | Bin 0 -> 5270 bytes .../__pycache__/dist.cpython-38.pyc | Bin 0 -> 42380 bytes .../__pycache__/extension.cpython-38.pyc | Bin 0 -> 2015 bytes .../__pycache__/glob.cpython-38.pyc | Bin 0 -> 3787 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 0 -> 2465 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 0 -> 4698 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 0 -> 39685 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 0 -> 3670 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 0 -> 33024 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 0 -> 1803 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 0 -> 1462 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 0 -> 504 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 15590 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 0 -> 6909 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 0 -> 1205 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 346 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 7437 bytes .../windows_support.cpython-38.pyc | Bin 0 -> 1043 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 73 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 208 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 0 -> 16466 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24481 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 758 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 596 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2814 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19788 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 10865 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1489 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 12119 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 257 + .../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-38.pyc | Bin 0 -> 766 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 0 -> 14236 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 0 -> 9949 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 0 -> 8695 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 0 -> 66748 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 0 -> 21827 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 4070 bytes .../install_egg_info.cpython-38.pyc | Bin 0 -> 2954 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 0 -> 5137 bytes .../install_scripts.cpython-38.pyc | Bin 0 -> 2327 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 0 -> 4664 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 0 -> 7913 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 0 -> 4591 bytes .../command/__pycache__/test.cpython-38.pyc | Bin 0 -> 8529 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2402 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 147 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 279 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1274 +++ .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2474 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 220 + .../setuptools/windows_support.py | 29 + .../simplejson-3.17.2.dist-info/INSTALLER | 1 + .../simplejson-3.17.2.dist-info/LICENSE.txt | 79 + .../simplejson-3.17.2.dist-info/METADATA | 71 + .../simplejson-3.17.2.dist-info/RECORD | 87 + .../simplejson-3.17.2.dist-info/WHEEL | 5 + .../simplejson-3.17.2.dist-info/top_level.txt | 1 + .../site-packages/simplejson/__init__.py | 584 ++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 20525 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 934 bytes .../__pycache__/decoder.cpython-38.pyc | Bin 0 -> 10576 bytes .../__pycache__/encoder.cpython-38.pyc | Bin 0 -> 18765 bytes .../__pycache__/errors.cpython-38.pyc | Bin 0 -> 2001 bytes .../__pycache__/ordered_dict.cpython-38.pyc | Bin 0 -> 3865 bytes .../__pycache__/raw_json.cpython-38.pyc | Bin 0 -> 570 bytes .../__pycache__/scanner.cpython-38.pyc | Bin 0 -> 2260 bytes .../__pycache__/tool.cpython-38.pyc | Bin 0 -> 1185 bytes .../_speedups.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 246376 bytes .../site-packages/simplejson/compat.py | 34 + .../site-packages/simplejson/decoder.py | 400 + .../site-packages/simplejson/encoder.py | 722 ++ .../site-packages/simplejson/errors.py | 53 + .../site-packages/simplejson/ordered_dict.py | 103 + .../site-packages/simplejson/raw_json.py | 9 + .../site-packages/simplejson/scanner.py | 85 + .../simplejson/tests/__init__.py | 74 + .../tests/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2748 bytes .../test_bigint_as_string.cpython-38.pyc | Bin 0 -> 1833 bytes .../test_bitsize_int_as_string.cpython-38.pyc | Bin 0 -> 2207 bytes .../test_check_circular.cpython-38.pyc | Bin 0 -> 1643 bytes .../__pycache__/test_decimal.cpython-38.pyc | Bin 0 -> 2674 bytes .../__pycache__/test_decode.cpython-38.pyc | Bin 0 -> 5445 bytes .../__pycache__/test_default.cpython-38.pyc | Bin 0 -> 597 bytes .../__pycache__/test_dump.cpython-38.pyc | Bin 0 -> 8693 bytes ...est_encode_basestring_ascii.cpython-38.pyc | Bin 0 -> 2309 bytes .../test_encode_for_html.cpython-38.pyc | Bin 0 -> 1844 bytes .../__pycache__/test_errors.cpython-38.pyc | Bin 0 -> 2391 bytes .../__pycache__/test_fail.cpython-38.pyc | Bin 0 -> 3871 bytes .../__pycache__/test_float.cpython-38.pyc | Bin 0 -> 1965 bytes .../__pycache__/test_for_json.cpython-38.pyc | Bin 0 -> 4632 bytes .../__pycache__/test_indent.cpython-38.pyc | Bin 0 -> 2281 bytes .../test_item_sort_key.cpython-38.pyc | Bin 0 -> 2062 bytes .../__pycache__/test_iterable.cpython-38.pyc | Bin 0 -> 1366 bytes .../test_namedtuple.cpython-38.pyc | Bin 0 -> 5069 bytes .../__pycache__/test_pass1.cpython-38.pyc | Bin 0 -> 2020 bytes .../__pycache__/test_pass2.cpython-38.pyc | Bin 0 -> 658 bytes .../__pycache__/test_pass3.cpython-38.pyc | Bin 0 -> 753 bytes .../__pycache__/test_raw_json.cpython-38.pyc | Bin 0 -> 1409 bytes .../__pycache__/test_recursion.cpython-38.pyc | Bin 0 -> 2038 bytes .../test_scanstring.cpython-38.pyc | Bin 0 -> 5108 bytes .../test_separators.cpython-38.pyc | Bin 0 -> 1252 bytes .../__pycache__/test_speedups.cpython-38.pyc | Bin 0 -> 4966 bytes .../test_str_subclass.cpython-38.pyc | Bin 0 -> 1069 bytes .../__pycache__/test_subclass.cpython-38.pyc | Bin 0 -> 1497 bytes .../__pycache__/test_tool.cpython-38.pyc | Bin 0 -> 3121 bytes .../__pycache__/test_tuple.cpython-38.pyc | Bin 0 -> 1386 bytes .../__pycache__/test_unicode.cpython-38.pyc | Bin 0 -> 6588 bytes .../simplejson/tests/test_bigint_as_string.py | 67 + .../tests/test_bitsize_int_as_string.py | 73 + .../simplejson/tests/test_check_circular.py | 30 + .../simplejson/tests/test_decimal.py | 71 + .../simplejson/tests/test_decode.py | 119 + .../simplejson/tests/test_default.py | 9 + .../simplejson/tests/test_dump.py | 249 + .../tests/test_encode_basestring_ascii.py | 47 + .../simplejson/tests/test_encode_for_html.py | 38 + .../simplejson/tests/test_errors.py | 68 + .../simplejson/tests/test_fail.py | 176 + .../simplejson/tests/test_float.py | 35 + .../simplejson/tests/test_for_json.py | 97 + .../simplejson/tests/test_indent.py | 86 + .../simplejson/tests/test_item_sort_key.py | 27 + .../simplejson/tests/test_iterable.py | 31 + .../simplejson/tests/test_namedtuple.py | 122 + .../simplejson/tests/test_pass1.py | 71 + .../simplejson/tests/test_pass2.py | 14 + .../simplejson/tests/test_pass3.py | 20 + .../simplejson/tests/test_raw_json.py | 47 + .../simplejson/tests/test_recursion.py | 67 + .../simplejson/tests/test_scanstring.py | 196 + .../simplejson/tests/test_separators.py | 42 + .../simplejson/tests/test_speedups.py | 114 + .../simplejson/tests/test_str_subclass.py | 21 + .../simplejson/tests/test_subclass.py | 37 + .../simplejson/tests/test_tool.py | 114 + .../simplejson/tests/test_tuple.py | 47 + .../simplejson/tests/test_unicode.py | 154 + .../site-packages/simplejson/tool.py | 42 + .../six-1.14.0.dist-info/AUTHORS.txt | 562 ++ .../six-1.14.0.dist-info/INSTALLER | 1 + .../six-1.14.0.dist-info/LICENSE.txt | 20 + .../six-1.14.0.dist-info/METADATA | 49 + .../site-packages/six-1.14.0.dist-info/RECORD | 11 + .../site-packages/six-1.14.0.dist-info/WHEEL | 6 + .../six-1.14.0.dist-info/top_level.txt | 1 + .../site-packages/six-1.14.0.virtualenv | 0 .tox/py38/lib/python3.8/site-packages/six.py | 980 ++ .../urllib3-1.25.8.dist-info/AUTHORS.txt | 562 ++ .../urllib3-1.25.8.dist-info/INSTALLER | 1 + .../urllib3-1.25.8.dist-info/LICENSE.txt | 20 + .../urllib3-1.25.8.dist-info/METADATA | 1238 +++ .../urllib3-1.25.8.dist-info/RECORD | 86 + .../urllib3-1.25.8.dist-info/WHEEL | 6 + .../urllib3-1.25.8.dist-info/top_level.txt | 1 + .../site-packages/urllib3-1.25.8.virtualenv | 0 .../site-packages/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2127 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 0 -> 10672 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 10107 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 0 -> 24203 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 10056 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 0 -> 8115 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 0 -> 2741 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 0 -> 12916 bytes .../__pycache__/request.cpython-38.pyc | Bin 0 -> 5655 bytes .../__pycache__/response.cpython-38.pyc | Bin 0 -> 20357 bytes .../site-packages/urllib3/_collections.py | 336 + .../site-packages/urllib3/connection.py | 414 + .../site-packages/urllib3/connectionpool.py | 1053 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 205 bytes .../_appengine_environ.cpython-38.pyc | Bin 0 -> 1429 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 0 -> 3277 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 0 -> 14930 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 0 -> 5589 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 121 + .../urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../site-packages/urllib3/contrib/socks.py | 210 + .../site-packages/urllib3/exceptions.py | 255 + .../python3.8/site-packages/urllib3/fields.py | 273 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 420 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 52 + .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 560 bytes .../_implementation.cpython-38.pyc | Bin 0 -> 3317 bytes .../ssl_match_hostname/_implementation.py | 160 + .../site-packages/urllib3/poolmanager.py | 470 + .../site-packages/urllib3/request.py | 171 + .../site-packages/urllib3/response.py | 809 ++ .../site-packages/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1025 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 3198 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 0 -> 1035 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 0 -> 3355 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 0 -> 1982 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 0 -> 12966 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 0 -> 9834 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 0 -> 8885 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 0 -> 10688 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 0 -> 3119 bytes .../site-packages/urllib3/util/connection.py | 138 + .../site-packages/urllib3/util/queue.py | 21 + .../site-packages/urllib3/util/request.py | 135 + .../site-packages/urllib3/util/response.py | 86 + .../site-packages/urllib3/util/retry.py | 450 + .../site-packages/urllib3/util/ssl_.py | 407 + .../site-packages/urllib3/util/timeout.py | 258 + .../site-packages/urllib3/util/url.py | 430 + .../site-packages/urllib3/util/wait.py | 153 + .../webencodings-0.5.1.dist-info/AUTHORS.txt | 562 ++ .../webencodings-0.5.1.dist-info/INSTALLER | 1 + .../webencodings-0.5.1.dist-info/LICENSE.txt | 20 + .../webencodings-0.5.1.dist-info/METADATA | 54 + .../webencodings-0.5.1.dist-info/RECORD | 20 + .../webencodings-0.5.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../webencodings-0.5.1.virtualenv | 0 .../site-packages/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 9745 bytes .../__pycache__/labels.cpython-38.pyc | Bin 0 -> 3843 bytes .../site-packages/webencodings/labels.py | 231 + .../site-packages/webencodings/mklabels.py | 59 + .../site-packages/webencodings/tests.py | 153 + .../webencodings/x_user_defined.py | 325 + .../wheel-0.34.2.dist-info/AUTHORS.txt | 562 ++ .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/LICENSE.txt | 20 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/RECORD | 43 + .../wheel-0.34.2.dist-info/WHEEL | 6 + .../wheel-0.34.2.dist-info/entry_points.txt | 6 + .../wheel-0.34.2.dist-info/top_level.txt | 1 + .../site-packages/wheel-0.34.2.virtualenv | 0 .../python3.8/site-packages/wheel/__init__.py | 1 + .../python3.8/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 217 bytes .../__pycache__/bdist_wheel.cpython-38.pyc | Bin 0 -> 10923 bytes .../__pycache__/macosx_libfile.cpython-38.pyc | Bin 0 -> 7144 bytes .../wheel/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 3753 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 7641 bytes .../wheel/__pycache__/pkginfo.cpython-38.pyc | Bin 0 -> 1578 bytes .../wheel/__pycache__/util.cpython-38.pyc | Bin 0 -> 1331 bytes .../__pycache__/wheelfile.cpython-38.pyc | Bin 0 -> 5549 bytes .../python3.8/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3101 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.8/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + .../python3.8/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + .../python3.8/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.8/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + .tox/py38/log/.lock | 0 .tox/py38/log/py38-0.log | 7 + .tox/py38/log/py38-1.log | 465 + .tox/py38/pyvenv.cfg | 8 + requirements.txt | 21 +- test-requirements.txt | 27 +- tox.ini | 85 +- 2479 files changed, 362233 insertions(+), 52 deletions(-) create mode 100644 .tox/pep8/bin/activate create mode 100644 .tox/pep8/bin/activate.csh create mode 100644 .tox/pep8/bin/activate.fish create mode 100644 .tox/pep8/bin/activate.ps1 create mode 100644 .tox/pep8/bin/activate.xsh create mode 100644 .tox/pep8/bin/activate_this.py create mode 100755 .tox/pep8/bin/chardetect create mode 100755 .tox/pep8/bin/chardetect-3.8 create mode 100755 .tox/pep8/bin/chardetect3 create mode 100755 .tox/pep8/bin/distro create mode 100755 .tox/pep8/bin/distro-3.8 create mode 100755 .tox/pep8/bin/distro3 create mode 100755 .tox/pep8/bin/easy_install create mode 100755 .tox/pep8/bin/easy_install-3.8 create mode 100755 .tox/pep8/bin/easy_install3 create mode 100755 .tox/pep8/bin/pbr create mode 100755 .tox/pep8/bin/pip create mode 100755 .tox/pep8/bin/pip-3.8 create mode 100755 .tox/pep8/bin/pip3 create mode 100755 .tox/pep8/bin/pip3.8 create mode 120000 .tox/pep8/bin/python create mode 120000 .tox/pep8/bin/python3 create mode 120000 .tox/pep8/bin/python3.8 create mode 100755 .tox/pep8/bin/wheel create mode 100755 .tox/pep8/bin/wheel-3.8 create mode 100755 .tox/pep8/bin/wheel3 create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/_virtualenv.pth create mode 100644 .tox/pep8/lib/python3.8/site-packages/_virtualenv.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/appdirs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/_cmd.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/adapter.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/cache.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/controller.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/filewrapper.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/heuristics.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/serialize.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/cachecontrol/wrapper.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/__main__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/__pycache__/core.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/cacert.pem create mode 100644 .tox/pep8/lib/python3.8/site-packages/certifi/core.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/big5freq.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/big5prober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/chardistribution.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/charsetgroupprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/charsetprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/cli/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/cli/chardetect.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/codingstatemachine.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/cp949prober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/enums.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/escprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/escsm.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/eucjpprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/euckrfreq.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/euckrprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/euctwfreq.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/euctwprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/gb2312freq.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/gb2312prober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/hebrewprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/jisfreq.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/jpcntx.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langbulgarianmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langcyrillicmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langgreekmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langhebrewmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langhungarianmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langthaimodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/langturkishmodel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/latin1prober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/mbcharsetprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/mbcsgroupprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/mbcssm.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/sbcharsetprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/sbcsgroupprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/sjisprober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/universaldetector.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/utf8prober.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/chardet/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/ansi.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/ansitowin32.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/initialise.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/win32.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/colorama/winterm.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/contextlib2.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/misc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/shutil.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/_backport/tarfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/database.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/index.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/locators.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/manifest.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/markers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/metadata.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/resources.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/scripts.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distlib/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro-1.4.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/distro.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/easy_install.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/_ihatexml.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/_inputstream.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/_tokenizer.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/_utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/constants.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/html5parser.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/__pycache__/serializer.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_ihatexml.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_inputstream.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_tokenizer.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/__pycache__/_base.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/__pycache__/datrie.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/__pycache__/py.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/_base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/datrie.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_trie/py.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/_utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/constants.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/alphabeticalattributes.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/inject_meta_charset.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/lint.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/optionaltags.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/sanitizer.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/filters/whitespace.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/html5parser.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/serializer.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treeadapters/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treeadapters/genshi.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treeadapters/sax.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/base.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/dom.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/etree.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treebuilders/etree_lxml.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/dom.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/etree.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/etree_lxml.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/html5lib/treewalkers/genshi.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna-2.8.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__pycache__/core.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/codec.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/core.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/idnadata.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/intranges.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/package_data.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/idna/uts46data.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr-2.2.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/ipaddr.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/pbr.json create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile-0.12.2.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/linklockfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/mkdirlockfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/pidlockfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/sqlitelockfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/lockfile/symlinklockfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack-0.6.2.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/__pycache__/_version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/_cmsgpack.cpython-38-x86_64-linux-gnu.so create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/_version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/exceptions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/msgpack/fallback.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging-20.3.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__about__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/_typing.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/_compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/_structures.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/_typing.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/markers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/py.typed create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/requirements.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/specifiers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/tags.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/packaging/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/DESCRIPTION.rst create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/metadata.json create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr-1.8.1.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/builddoc.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/core.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/extra_files.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/find_package.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/git.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/options.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/packaging.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/pbr_json.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/testr_command.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/builddoc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/cmd/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/cmd/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/cmd/__pycache__/main.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/cmd/main.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/core.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/extra_files.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/find_package.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/git.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/backwards.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/base.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/commands.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/files.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/backwards.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/commands.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/files.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/hooks/metadata.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/options.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/packaging.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/pbr_json.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/testr_command.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/base.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_commands.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_core.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_files.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_hooks.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_integration.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_packaging.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_setup.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/test_wsgi.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/__pycache__/util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_commands.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_core.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_files.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_hooks.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_integration.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_packaging.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_setup.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/test_wsgi.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/CHANGES.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/MANIFEST.in create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/README.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/__pycache__/setup.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/a.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/b.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/c.rst create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/extra-file.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/git-extra-file.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/_setup_hooks.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/cmd.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/extra.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/wsgi.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/cmd.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/extra.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/wsgi.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/setup.cfg create mode 100755 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/setup.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/src/testext.c create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/testpackage/test-requirements.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/tests/util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pbr/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517-0.8.2.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/__pycache__/wrappers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/_in_process.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/build.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/check.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/colorlog.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/dirtools.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/envbuild.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/meta.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pep517/wrappers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip-20.0.2.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/__main__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/build_env.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cache.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/base_command.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/command_context.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/main.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/parser.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/req_command.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/check.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/completion.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/configuration.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/debug.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/download.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/freeze.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/hash.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/help.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/install.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/list.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/search.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/show.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/commands/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/configuration.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/base.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/installed.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/exceptions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/collector.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/index/package_finder.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/locations.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/main.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/candidate.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/format_control.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/index.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/link.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/scheme.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/search_scope.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/target_python.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/models/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/auth.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/cache.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/download.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/session.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/check.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/freeze.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/operations/prepare.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/pep425tags.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/pyproject.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/constructors.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/req_file.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/req_install.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/req_set.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/encoding.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/glibc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/hashes.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/logging.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/marker_files.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/misc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/models.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/packaging.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/typing.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/ui.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/urls.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/utils/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/git.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_internal/wheel_builder.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_vendor/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources-0.0.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/_vendor/six.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/extern/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pkg_resources/py31compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress-1.5.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/__pycache__/bar.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/__pycache__/spinner.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/bar.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/counter.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/progress/spinner.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing-2.4.6.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/pyparsing.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml-0.1.21.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/core.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/parser.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/test.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/__pycache__/writer.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/core.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/parser.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/test.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/pytoml/writer.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests-2.22.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/__version__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/_internal_utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/adapters.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/api.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/auth.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/certs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/cookies.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/exceptions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/help.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/hooks.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/models.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/packages.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/sessions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/status_codes.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/structures.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/requests/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying-1.3.3.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/retrying.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/zip-safe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools-44.0.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_deprecation_warning.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_imp.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/_vendor/six.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/archive_util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/build_meta.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/cli-32.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/cli-64.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/cli.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/__pycache__/test.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/alias.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/bdist_egg.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/build_clib.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/build_ext.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/build_py.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/develop.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/dist_info.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/easy_install.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/egg_info.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/install.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/install_egg_info.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/install_lib.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/install_scripts.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/py36compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/register.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/rotate.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/saveopts.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/sdist.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/setopt.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/test.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/upload.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/command/upload_docs.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/config.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/dep_util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/depends.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/dist.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/errors.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/extension.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/extern/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/glob.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/gui-32.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/gui-64.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/gui.exe create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/installer.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/launch.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/lib2to3_ex.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/monkey.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/msvc.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/namespaces.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/package_index.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/py27compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/py31compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/py33compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/py34compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/sandbox.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/script (dev).tmpl create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/script.tmpl create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/site-patch.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/ssl_support.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/unicode_utils.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/setuptools/windows_support.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/decoder.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/encoder.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/errors.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/ordered_dict.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/raw_json.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/scanner.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/__pycache__/tool.cpython-38.pyc create mode 100755 .tox/pep8/lib/python3.8/site-packages/simplejson/_speedups.cpython-38-x86_64-linux-gnu.so create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/compat.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/decoder.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/encoder.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/errors.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/ordered_dict.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/raw_json.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/scanner.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_bigint_as_string.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_bitsize_int_as_string.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_check_circular.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_decimal.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_decode.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_default.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_dump.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_encode_basestring_ascii.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_encode_for_html.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_errors.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_fail.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_float.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_for_json.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_indent.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_item_sort_key.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_iterable.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_namedtuple.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass1.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass2.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass3.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_raw_json.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_recursion.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_scanstring.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_separators.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_speedups.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_str_subclass.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_subclass.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_tool.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_tuple.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_unicode.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_bigint_as_string.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_bitsize_int_as_string.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_check_circular.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_decimal.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_decode.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_default.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_dump.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_encode_basestring_ascii.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_encode_for_html.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_errors.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_fail.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_float.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_for_json.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_indent.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_item_sort_key.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_iterable.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_namedtuple.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_pass1.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_pass2.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_pass3.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_raw_json.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_recursion.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_scanstring.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_separators.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_speedups.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_str_subclass.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_subclass.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_tool.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_tuple.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tests/test_unicode.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/simplejson/tool.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/six-1.14.0.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/six.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3-1.25.8.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/_collections.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/connection.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/connectionpool.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/appengine.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/securetransport.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/contrib/socks.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/exceptions.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/fields.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/filepost.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/poolmanager.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/request.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/response.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/connection.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/queue.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/request.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/response.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/retry.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/ssl_.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/timeout.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/url.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/urllib3/util/wait.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings-0.5.1.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/__pycache__/labels.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/labels.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/mklabels.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/tests.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/webencodings/x_user_defined.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/AUTHORS.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel-0.34.2.virtualenv create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__main__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/bdist_wheel.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/macosx_libfile.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/pep425tags.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/pkginfo.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/util.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/__pycache__/wheelfile.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/_version.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/bdist_wheel.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/cli/__init__.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/cli/convert.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/cli/pack.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/cli/unpack.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/macosx_libfile.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/metadata.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/pep425tags.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/pkginfo.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/util.py create mode 100644 .tox/pep8/lib/python3.8/site-packages/wheel/wheelfile.py create mode 100755 .tox/pep8/log/.lock create mode 100644 .tox/pep8/log/pep8-0.log create mode 100644 .tox/pep8/log/pep8-1.log create mode 100644 .tox/pep8/pyvenv.cfg create mode 100644 .tox/py38/bin/activate create mode 100644 .tox/py38/bin/activate.csh create mode 100644 .tox/py38/bin/activate.fish create mode 100644 .tox/py38/bin/activate.ps1 create mode 100644 .tox/py38/bin/activate.xsh create mode 100644 .tox/py38/bin/activate_this.py create mode 100755 .tox/py38/bin/chardetect create mode 100755 .tox/py38/bin/chardetect-3.8 create mode 100755 .tox/py38/bin/chardetect3 create mode 100755 .tox/py38/bin/distro create mode 100755 .tox/py38/bin/distro-3.8 create mode 100755 .tox/py38/bin/distro3 create mode 100755 .tox/py38/bin/easy_install create mode 100755 .tox/py38/bin/easy_install-3.8 create mode 100755 .tox/py38/bin/easy_install3 create mode 100755 .tox/py38/bin/pbr create mode 100755 .tox/py38/bin/pip create mode 100755 .tox/py38/bin/pip-3.8 create mode 100755 .tox/py38/bin/pip3 create mode 100755 .tox/py38/bin/pip3.8 create mode 120000 .tox/py38/bin/python create mode 120000 .tox/py38/bin/python3 create mode 120000 .tox/py38/bin/python3.8 create mode 100755 .tox/py38/bin/wheel create mode 100755 .tox/py38/bin/wheel-3.8 create mode 100755 .tox/py38/bin/wheel3 create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/_virtualenv.pth create mode 100644 .tox/py38/lib/python3.8/site-packages/_virtualenv.py create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/appdirs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/_cmd.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/adapter.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/cache.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/controller.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/filewrapper.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/heuristics.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/serialize.py create mode 100644 .tox/py38/lib/python3.8/site-packages/cachecontrol/wrapper.py create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/__main__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/__pycache__/core.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/cacert.pem create mode 100644 .tox/py38/lib/python3.8/site-packages/certifi/core.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet-3.0.4.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/big5freq.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/big5prober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/chardistribution.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/charsetgroupprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/charsetprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/cli/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/cli/chardetect.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/codingstatemachine.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/cp949prober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/enums.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/escprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/escsm.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/eucjpprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/euckrfreq.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/euckrprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/euctwfreq.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/euctwprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/gb2312freq.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/gb2312prober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/hebrewprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/jisfreq.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/jpcntx.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langbulgarianmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langcyrillicmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langgreekmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langhebrewmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langhungarianmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langthaimodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/langturkishmodel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/latin1prober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/mbcharsetprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/mbcsgroupprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/mbcssm.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/sbcharsetprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/sbcsgroupprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/sjisprober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/universaldetector.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/utf8prober.py create mode 100644 .tox/py38/lib/python3.8/site-packages/chardet/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama-0.4.3.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/ansi.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/ansitowin32.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/initialise.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/win32.py create mode 100644 .tox/py38/lib/python3.8/site-packages/colorama/winterm.py create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/contextlib2.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib-0.3.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/misc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/shutil.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/sysconfig.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/_backport/tarfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/database.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/index.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/locators.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/manifest.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/markers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/metadata.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/resources.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/scripts.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distlib/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/distro-1.4.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/distro.py create mode 100644 .tox/py38/lib/python3.8/site-packages/easy_install.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib-1.0.1.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/_ihatexml.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/_inputstream.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/_tokenizer.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/_utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/constants.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/html5parser.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/__pycache__/serializer.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_ihatexml.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_inputstream.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_tokenizer.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/__pycache__/_base.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/__pycache__/datrie.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/__pycache__/py.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/_base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/datrie.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_trie/py.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/_utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/constants.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/alphabeticalattributes.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/inject_meta_charset.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/lint.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/optionaltags.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/sanitizer.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/filters/whitespace.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/html5parser.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/serializer.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treeadapters/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treeadapters/genshi.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treeadapters/sax.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/base.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/dom.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/etree.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treebuilders/etree_lxml.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/dom.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/etree.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/etree_lxml.py create mode 100644 .tox/py38/lib/python3.8/site-packages/html5lib/treewalkers/genshi.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/idna-2.8.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__pycache__/core.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/codec.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/core.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/idnadata.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/intranges.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/package_data.py create mode 100644 .tox/py38/lib/python3.8/site-packages/idna/uts46data.py create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr-2.2.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/ipaddr.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/pbr.json create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile-0.12.2.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/linklockfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/mkdirlockfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/pidlockfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/sqlitelockfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/lockfile/symlinklockfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack-0.6.2.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/__pycache__/_version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/_cmsgpack.cpython-38-x86_64-linux-gnu.so create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/_version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/exceptions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/msgpack/fallback.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging-20.3.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__about__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/_typing.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/_compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/_structures.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/_typing.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/markers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/py.typed create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/requirements.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/specifiers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/tags.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/packaging/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/DESCRIPTION.rst create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/metadata.json create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr-1.8.1.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/builddoc.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/core.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/extra_files.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/find_package.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/git.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/options.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/packaging.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/pbr_json.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/testr_command.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/builddoc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/cmd/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/cmd/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/cmd/__pycache__/main.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/cmd/main.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/core.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/extra_files.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/find_package.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/git.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/backwards.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/base.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/commands.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/files.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/backwards.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/commands.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/files.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/hooks/metadata.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/options.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/packaging.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/pbr_json.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/testr_command.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/base.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_commands.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_core.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_files.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_hooks.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_integration.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_packaging.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_setup.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/test_wsgi.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/__pycache__/util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_commands.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_core.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_files.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_hooks.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_integration.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_packaging.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_setup.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/test_wsgi.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/CHANGES.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/MANIFEST.in create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/README.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/__pycache__/setup.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/a.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/b.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/data_files/c.rst create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/extra-file.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/git-extra-file.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/_setup_hooks.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/cmd.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/extra.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/__pycache__/wsgi.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/_setup_hooks.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/cmd.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/extra.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/package_data/1.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/package_data/2.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/pbr_testpackage/wsgi.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/setup.cfg create mode 100755 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/setup.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/src/testext.c create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/testpackage/test-requirements.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/tests/util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pbr/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517-0.8.2.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/__pycache__/wrappers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/_in_process.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/build.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/check.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/colorlog.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/dirtools.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/envbuild.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/meta.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pep517/wrappers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pip-20.0.2.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/__main__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/build_env.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cache.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/base_command.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/command_context.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/main.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/parser.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/req_command.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/check.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/completion.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/configuration.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/debug.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/download.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/freeze.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/hash.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/help.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/install.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/list.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/search.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/show.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/commands/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/configuration.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/base.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/installed.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/exceptions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/collector.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/index/package_finder.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/locations.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/main.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/candidate.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/format_control.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/index.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/link.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/scheme.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/search_scope.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/target_python.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/models/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/auth.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/cache.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/download.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/session.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/check.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/freeze.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/operations/prepare.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/pep425tags.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/pyproject.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/constructors.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/req_file.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/req_install.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/req_set.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/encoding.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/glibc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/hashes.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/logging.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/marker_files.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/misc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/models.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/packaging.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/typing.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/ui.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/urls.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/utils/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/git.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_internal/wheel_builder.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_vendor/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources-0.0.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/_vendor/six.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/extern/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pkg_resources/py31compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/progress-1.5.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/__pycache__/bar.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/__pycache__/spinner.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/bar.py create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/counter.py create mode 100644 .tox/py38/lib/python3.8/site-packages/progress/spinner.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing-2.4.6.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/pyparsing.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml-0.1.21.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/core.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/parser.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/test.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/__pycache__/writer.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/core.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/parser.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/test.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/pytoml/writer.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/requests-2.22.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/__version__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/_internal_utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/adapters.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/api.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/auth.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/certs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/cookies.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/exceptions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/help.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/hooks.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/models.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/packages.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/sessions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/status_codes.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/structures.py create mode 100644 .tox/py38/lib/python3.8/site-packages/requests/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying-1.3.3.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/retrying.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/zip-safe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools-44.0.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_deprecation_warning.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_imp.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/_vendor/six.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/archive_util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/build_meta.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/cli-32.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/cli-64.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/cli.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/__pycache__/test.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/alias.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/bdist_egg.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/build_clib.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/build_ext.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/build_py.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/develop.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/dist_info.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/easy_install.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/egg_info.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/install.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/install_egg_info.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/install_lib.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/install_scripts.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/py36compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/register.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/rotate.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/saveopts.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/sdist.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/setopt.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/test.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/upload.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/command/upload_docs.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/config.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/dep_util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/depends.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/dist.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/errors.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/extension.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/extern/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/glob.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/gui-32.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/gui-64.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/gui.exe create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/installer.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/launch.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/lib2to3_ex.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/monkey.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/msvc.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/namespaces.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/package_index.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/py27compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/py31compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/py33compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/py34compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/sandbox.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/script (dev).tmpl create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/script.tmpl create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/site-patch.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/ssl_support.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/unicode_utils.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/setuptools/windows_support.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson-3.17.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/compat.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/decoder.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/encoder.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/errors.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/ordered_dict.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/raw_json.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/scanner.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/__pycache__/tool.cpython-38.pyc create mode 100755 .tox/py38/lib/python3.8/site-packages/simplejson/_speedups.cpython-38-x86_64-linux-gnu.so create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/compat.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/decoder.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/encoder.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/errors.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/ordered_dict.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/raw_json.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/scanner.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_bigint_as_string.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_bitsize_int_as_string.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_check_circular.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_decimal.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_decode.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_default.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_dump.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_encode_basestring_ascii.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_encode_for_html.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_errors.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_fail.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_float.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_for_json.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_indent.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_item_sort_key.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_iterable.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_namedtuple.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass1.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass2.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_pass3.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_raw_json.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_recursion.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_scanstring.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_separators.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_speedups.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_str_subclass.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_subclass.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_tool.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_tuple.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/__pycache__/test_unicode.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_bigint_as_string.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_bitsize_int_as_string.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_check_circular.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_decimal.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_decode.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_default.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_dump.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_encode_basestring_ascii.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_encode_for_html.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_errors.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_fail.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_float.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_for_json.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_indent.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_item_sort_key.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_iterable.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_namedtuple.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_pass1.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_pass2.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_pass3.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_raw_json.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_recursion.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_scanstring.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_separators.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_speedups.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_str_subclass.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_subclass.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_tool.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_tuple.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tests/test_unicode.py create mode 100644 .tox/py38/lib/python3.8/site-packages/simplejson/tool.py create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/six-1.14.0.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/six.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3-1.25.8.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/_collections.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/connection.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/connectionpool.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/appengine.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/securetransport.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/contrib/socks.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/exceptions.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/fields.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/filepost.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/poolmanager.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/request.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/response.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/connection.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/queue.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/request.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/response.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/retry.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/ssl_.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/timeout.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/url.py create mode 100644 .tox/py38/lib/python3.8/site-packages/urllib3/util/wait.py create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings-0.5.1.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/__pycache__/labels.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/labels.py create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/mklabels.py create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/tests.py create mode 100644 .tox/py38/lib/python3.8/site-packages/webencodings/x_user_defined.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/AUTHORS.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel-0.34.2.virtualenv create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__main__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/bdist_wheel.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/macosx_libfile.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/metadata.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/pep425tags.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/pkginfo.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/util.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/__pycache__/wheelfile.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/_version.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/bdist_wheel.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/cli/__init__.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/cli/convert.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/cli/pack.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/cli/unpack.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/macosx_libfile.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/metadata.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/pep425tags.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/pkginfo.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/util.py create mode 100644 .tox/py38/lib/python3.8/site-packages/wheel/wheelfile.py create mode 100755 .tox/py38/log/.lock create mode 100644 .tox/py38/log/py38-0.log create mode 100644 .tox/py38/log/py38-1.log create mode 100644 .tox/py38/pyvenv.cfg diff --git a/.tox/pep8/bin/activate b/.tox/pep8/bin/activate new file mode 100644 index 0000000..2c11ea1 --- /dev/null +++ b/.tox/pep8/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV='/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8' +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/.tox/pep8/bin/activate.csh b/.tox/pep8/bin/activate.csh new file mode 100644 index 0000000..07ff031 --- /dev/null +++ b/.tox/pep8/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV '/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8' + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ('' != "") then + set env_name = '' +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/.tox/pep8/bin/activate.fish b/.tox/pep8/bin/activate.fish new file mode 100644 index 0000000..a68e5f8 --- /dev/null +++ b/.tox/pep8/bin/activate.fish @@ -0,0 +1,100 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | head -c 1) -lt 3 + set -gx PATH (_fishify_path "$_OLD_VIRTUAL_PATH") + else + set -gx PATH "$_OLD_VIRTUAL_PATH" + end + 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" + and functions -q _old_fish_prompt + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV '/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8' + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | head -c 1) -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH "$PATH" +end +set -gx PATH "$VIRTUAL_ENV"'/bin' $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Run the user's prompt first; it might depend on (pipe)status. + set -l prompt (_old_fish_prompt) + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n '' + printf '%s%s' '' (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + string join -- \n $prompt # handle multi-line prompts + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/.tox/pep8/bin/activate.ps1 b/.tox/pep8/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/.tox/pep8/bin/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) { + if (Test-Path variable:_OLD_VIRTUAL_PATH) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global + } + + if (Test-Path function:_old_virtual_prompt) { + $function:prompt = $function:_old_virtual_prompt + Remove-Item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/.tox/pep8/bin/activate.xsh b/.tox/pep8/bin/activate.xsh new file mode 100644 index 0000000..c8883e0 --- /dev/null +++ b/.tox/pep8/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/.tox/pep8/bin/activate_this.py b/.tox/pep8/bin/activate_this.py new file mode 100644 index 0000000..4479986 --- /dev/null +++ b/.tox/pep8/bin/activate_this.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + abs_file = os.path.abspath(__file__) +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +bin_dir = os.path.dirname(abs_file) +base = bin_dir[: -len("bin") - 1] # strip away the bin part from the __file__, plus the path separator + +# prepend bin to PATH (this file is inside the bin directory) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) +os.environ["VIRTUAL_ENV"] = base # virtual env is right above bin directory + +# add the virtual environments libraries to the host python import mechanism +prev_length = len(sys.path) +for lib in "../lib/python3.8/site-packages".split(os.pathsep): + path = os.path.realpath(os.path.join(bin_dir, lib)) + site.addsitedir(path.decode("utf-8") if "" else path) +sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length] + +sys.real_prefix = sys.prefix +sys.prefix = base diff --git a/.tox/pep8/bin/chardetect b/.tox/pep8/bin/chardetect new file mode 100755 index 0000000..f62773b --- /dev/null +++ b/.tox/pep8/bin/chardetect @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/chardetect-3.8 b/.tox/pep8/bin/chardetect-3.8 new file mode 100755 index 0000000..f62773b --- /dev/null +++ b/.tox/pep8/bin/chardetect-3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/chardetect3 b/.tox/pep8/bin/chardetect3 new file mode 100755 index 0000000..f62773b --- /dev/null +++ b/.tox/pep8/bin/chardetect3 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/distro b/.tox/pep8/bin/distro new file mode 100755 index 0000000..2135689 --- /dev/null +++ b/.tox/pep8/bin/distro @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/distro-3.8 b/.tox/pep8/bin/distro-3.8 new file mode 100755 index 0000000..2135689 --- /dev/null +++ b/.tox/pep8/bin/distro-3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/distro3 b/.tox/pep8/bin/distro3 new file mode 100755 index 0000000..2135689 --- /dev/null +++ b/.tox/pep8/bin/distro3 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/easy_install b/.tox/pep8/bin/easy_install new file mode 100755 index 0000000..67928f1 --- /dev/null +++ b/.tox/pep8/bin/easy_install @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/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/.tox/pep8/bin/easy_install-3.8 b/.tox/pep8/bin/easy_install-3.8 new file mode 100755 index 0000000..67928f1 --- /dev/null +++ b/.tox/pep8/bin/easy_install-3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/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/.tox/pep8/bin/easy_install3 b/.tox/pep8/bin/easy_install3 new file mode 100755 index 0000000..67928f1 --- /dev/null +++ b/.tox/pep8/bin/easy_install3 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/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/.tox/pep8/bin/pbr b/.tox/pep8/bin/pbr new file mode 100755 index 0000000..524acc0 --- /dev/null +++ b/.tox/pep8/bin/pbr @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pbr.cmd.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/pip b/.tox/pep8/bin/pip new file mode 100755 index 0000000..74c05d5 --- /dev/null +++ b/.tox/pep8/bin/pip @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/pip-3.8 b/.tox/pep8/bin/pip-3.8 new file mode 100755 index 0000000..74c05d5 --- /dev/null +++ b/.tox/pep8/bin/pip-3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/pip3 b/.tox/pep8/bin/pip3 new file mode 100755 index 0000000..74c05d5 --- /dev/null +++ b/.tox/pep8/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/pip3.8 b/.tox/pep8/bin/pip3.8 new file mode 100755 index 0000000..74c05d5 --- /dev/null +++ b/.tox/pep8/bin/pip3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/python b/.tox/pep8/bin/python new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/.tox/pep8/bin/python @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/.tox/pep8/bin/python3 b/.tox/pep8/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/.tox/pep8/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/.tox/pep8/bin/python3.8 b/.tox/pep8/bin/python3.8 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/.tox/pep8/bin/python3.8 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/.tox/pep8/bin/wheel b/.tox/pep8/bin/wheel new file mode 100755 index 0000000..9a25adf --- /dev/null +++ b/.tox/pep8/bin/wheel @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/wheel-3.8 b/.tox/pep8/bin/wheel-3.8 new file mode 100755 index 0000000..9a25adf --- /dev/null +++ b/.tox/pep8/bin/wheel-3.8 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/bin/wheel3 b/.tox/pep8/bin/wheel3 new file mode 100755 index 0000000..9a25adf --- /dev/null +++ b/.tox/pep8/bin/wheel3 @@ -0,0 +1,8 @@ +#!/home/narinder/develop/charm/charm-cinder-netapp/.tox/pep8/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA new file mode 100644 index 0000000..3119fa9 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA @@ -0,0 +1,71 @@ +Metadata-Version: 2.1 +Name: CacheControl +Version: 0.12.6 +Summary: httplib2 caching for requests +Home-page: https://github.com/ionrock/cachecontrol +Author: Eric Larson +Author-email: eric@ionrock.org +License: UNKNOWN +Keywords: requests http caching web +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: filecache +Requires-Dist: lockfile (>=0.9) ; extra == 'filecache' +Provides-Extra: redis +Requires-Dist: redis (>=2.10.5) ; extra == 'redis' + +============== + CacheControl +============== + +.. image:: https://img.shields.io/pypi/v/cachecontrol.svg + :target: https://pypi.python.org/pypi/cachecontrol + :alt: Latest Version + +.. image:: https://travis-ci.org/ionrock/cachecontrol.png?branch=master + :target: https://travis-ci.org/ionrock/cachecontrol + +CacheControl is a port of the caching algorithms in httplib2_ for use with +requests_ session object. + +It was written because httplib2's better support for caching is often +mitigated by its lack of thread safety. The same is true of requests in +terms of caching. + + +Quickstart +========== + +.. code-block:: python + + import requests + + from cachecontrol import CacheControl + + + sess = requests.session() + cached_sess = CacheControl(sess) + + response = cached_sess.get('http://google.com') + +If the URL contains any caching based headers, it will cache the +result in a simple dictionary. + +For more info, check out the docs_ + +.. _docs: http://cachecontrol.readthedocs.org/en/latest/ +.. _httplib2: https://github.com/jcgregorio/httplib2 +.. _requests: http://docs.python-requests.org/ + + diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD new file mode 100644 index 0000000..35572b2 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD @@ -0,0 +1,37 @@ +cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +cachecontrol/_cmd.py,sha256=88j4P3JlJGqg6xAXR4btN9fYruXUH4CE-M93Sie5IB8,1242 +cachecontrol/adapter.py,sha256=ctnbSXDOj0V0NaxJP2jFauOYRDHaNYMP9QCE8kB4kfk,4870 +cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +cachecontrol/compat.py,sha256=Fn_aYzqNbN0bK9gUn8SQUzMLxQ_ruGnsEMvryYDFh3o,647 +cachecontrol/controller.py,sha256=fpLmIvxce2mKVFmtDFiiyydqU_pPbCucYLC9qP-LqvY,14137 +cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +cachecontrol/serialize.py,sha256=Jms7OS4GB2JFUzuMPlmQtuCDzcjjE-2ijrHpUXC2BV0,7062 +cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +cachecontrol/caches/redis_cache.py,sha256=yZP1PoUgAvxEZZrCVwImZ-5pFKU41v5HYJf1rfbXYmM,844 +CacheControl-0.12.6.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +CacheControl-0.12.6.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +CacheControl-0.12.6.dist-info/METADATA,sha256=DzDqga-Bw7B7ylVrJanU_-imHV1od8Ok64qr5ugT-5A,2107 +CacheControl-0.12.6.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +CacheControl-0.12.6.dist-info/top_level.txt,sha256=vGYWzpbe3h6gkakV4f7iCK2x3KyK3oMkV5pe5v25-d4,13 +CacheControl-0.12.6.dist-info/RECORD,, +cachecontrol/__pycache__,, +cachecontrol/__init__.cpython-38.pyc,, +CacheControl-0.12.6.virtualenv,, +cachecontrol/cache.cpython-38.pyc,, +CacheControl-0.12.6.dist-info/__pycache__,, +cachecontrol/heuristics.cpython-38.pyc,, +cachecontrol/filewrapper.cpython-38.pyc,, +cachecontrol/wrapper.cpython-38.pyc,, +cachecontrol/caches/__pycache__,, +cachecontrol/caches/file_cache.cpython-38.pyc,, +cachecontrol/caches/redis_cache.cpython-38.pyc,, +cachecontrol/adapter.cpython-38.pyc,, +CacheControl-0.12.6.dist-info/INSTALLER,, +cachecontrol/caches/__init__.cpython-38.pyc,, +cachecontrol/controller.cpython-38.pyc,, +cachecontrol/serialize.cpython-38.pyc,, +cachecontrol/compat.cpython-38.pyc,, +cachecontrol/_cmd.cpython-38.pyc,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt new file mode 100644 index 0000000..af37ac6 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt @@ -0,0 +1 @@ +cachecontrol diff --git a/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv b/.tox/pep8/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b04482a25572fcadb1579afe7dc546db8393b60 GIT binary patch literal 3991 zcmZu!&6C_l74L3oG@9Aj^?DtfwVe+UD3YP#8Nd}Vsl^o&C&X1|E5yzR0!nD5o*nIK zq)B&A;tbl;x+>ukE*z=U8cycOnLmI7e}S%?{4a2U-)qh6N9^A1)>ErLUcdKyzkc(< z>S~vv{PPE8^y&s<|Dl)DrG=L_QFVDsmoj`xK#&e9t*@W$O_Sz0^tFhb(NT zt^zoliH=vw@z==y~3*_=3EO^*B}#_gMeJ{N{VHNybtKW*nO!Rx*gE(>#-DfLApu zOg52$De+kbpJvL;;yjQAq_UXE!aRX}*mlC{u_yvhXHj(kp<;V%kN=TOc!O-oygk0OfY3&CF!E4&pp7KhwcXOGW!9WiiTjXV6cV&?r{BGumH6sW^y_ zKgT93i(r)H@(sJ**qEt)V>nF9L=UE)n{inTO0_$@KFkVjum_&0d@vZBN&cO5x%su_ zZg#nAw4CnR_3qK;eVHBTk=EH{b(S-U&2mbJ4lKYz@_OJ$x$(^zR4HJ*;F ziyyQ9%HbFu9u~18T&Q6xKb3ho9VX*gO`7&vVn1Cgq(P_*2c~>5oXY8qAuKR#Aa;Fl zW2iGDuTA4*Ki-vk7%gH4p#vD!8&7Zk9C;L6#28=aUE%Xf+~-}?H9r3y4xfx+ENuo` zd6~qyzBzb$iS51!dlW$`+d&YOg}R94(CN}l`=TzON6|KlHmtiRD-$DX4-NBu(d(&8 zkosc2b{rK0lIG{MG_$EG%Us)zzIZ|odE(M=Ua$QUW_b@zd&gP{J)IGxNKa*g7x!+N z?Bm&n_9lz-1hdW*TI)?zy@f_HFfI#4%0nl`F=XqIfp0sOae3I5e%eaChwPAt9mws} zw{q8VTeogUjS};BZUqyl6%d9HVC2~a-!&v-jgS?)mgTa^v{VKJczp0+Ql>Ldz;;51 zT$T<5ve{dx`rl|OZWsdYUtl(9z3*E|{ORu;Un+3j{LjXLBo4)aiy&nC9rX_bX|I)X z^tGy%dN<{TNX3C?5R7}R%0oZGQ|(~QcHyG+5B#cK`I!6leA9HAQKnm=_fQ-&8b+u-DnI*!%2n>>kFxj@ylN``F6V|1o+H^3Ha> zA|J>kYR+D-2A|8ke zyP1v(`B@ZCv#>Lo6-i`Oa1h|NOYaTfE$RvIR;}w0^vh@%-#~zQTu`8i9;d%`^a#F* zu=Dt)n4e!@XmE_;g!p7xNTzB*KxeAp>_c3y72jiq0}fY=XnM%3kNNgvr}iVOWfZ9Z zGZulSz7M(f8gqYBYg+kT)FwVb4qZOKu+;37o6hJ)q4W&h4scVP(oI-xkqoHUFkW3l z({~zWT(YGaQnxkWi51Cl+o;+{!>m63DUD8Jg>Uy))BvOEZnVHp6xF>b`UI&2ZGg9S z6ybt~J*=CrVz7Fd8jGPG?rD=H2;gy|4J z{Q5%lVUsU`^Ox&ypK%a5hZx0zht6u)5txFqGb2cVWb&|8@aGT~6nAqT7~~uy zWEK@aawy+O#brj+_Oof%|iG>fI{12tyviPshpVFtXy?Pyc)h&%g z)L8$(ISm~+-=KqUo|Y#59#s=-FdNE&4dwYur*>JoqY3H-5&%^Ew=7oG4>4Q)h#In= z)#ub!CxE+wufIXH){4=y1Qxz&<|`YkwrHkHa6 z!Cn)VC5b|aTcnC2kks)pEJr;?su4v=9&3%TIB^ki)daQSD$DO4pTF?*5oqP*4d*=* z2KK&MU2KxbJYQ~Pce{;EY*uBp9@CZ-b3XT7+tYthU8f57fjjg|icAPL0O literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2e63e8b887f5b2f2f4b55721bbc954308b42911 GIT binary patch literal 20542 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcd539e50bb5d341843ea60a10a0cb505b0dd302 GIT binary patch literal 15532 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 Q@$aV8zm0sR@MO{Wzp$If(*OVf literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d7ec3fe6c9c5caff8a7e4b3e8c56ba5a5eaba9e GIT binary patch literal 240354 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�yt|uopH@z8` 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7635ed198bbd5bb27c546c086aa8b95f74baeb0 GIT binary patch literal 8024 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbd37e96b3fb249ffb48f2bae55cbe16c0d5ab01 GIT binary patch literal 26906 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/_virtualenv.pth b/.tox/pep8/lib/python3.8/site-packages/_virtualenv.pth new file mode 100644 index 0000000..1c3ff99 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/_virtualenv.pth @@ -0,0 +1 @@ +import _virtualenv \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/_virtualenv.py b/.tox/pep8/lib/python3.8/site-packages/_virtualenv.py new file mode 100644 index 0000000..b399da4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/_virtualenv.py @@ -0,0 +1,115 @@ +"""Patches that are applied at runtime to the virtual environment""" +# -*- coding: utf-8 -*- + +import os +import sys + +VIRTUALENV_PATCH_FILE = os.path.join(__file__) + + +def patch_dist(dist): + """ + Distutils allows user to configure some arguments via a configuration file: + https://docs.python.org/3/install/index.html#distutils-configuration-files + + Some of this arguments though don't make sense in context of the virtual environment files, let's fix them up. + """ + # we cannot allow some install config as that would get packages installed outside of the virtual environment + old_parse_config_files = dist.Distribution.parse_config_files + + def parse_config_files(self, *args, **kwargs): + result = old_parse_config_files(self, *args, **kwargs) + install = self.get_option_dict("install") + + if "prefix" in install: # the prefix governs where to install the libraries + install["prefix"] = VIRTUALENV_PATCH_FILE, os.path.abspath(sys.prefix) + for base in ("purelib", "platlib", "headers", "scripts", "data"): + key = "install_{}".format(base) + if key in install: # do not allow global configs to hijack venv paths + install.pop(key, None) + return result + + dist.Distribution.parse_config_files = parse_config_files + + +# Import hook that patches some modules to ignore configuration values that break package installation in case +# of virtual environments. +_DISTUTILS_PATCH = "distutils.dist", "setuptools.dist" +if sys.version_info > (3, 4): + # https://docs.python.org/3/library/importlib.html#setting-up-an-importer + from importlib.abc import MetaPathFinder + from importlib.util import find_spec + from threading import Lock + from functools import partial + + class _Finder(MetaPathFinder): + """A meta path finder that allows patching the imported distutils modules""" + + fullname = None + lock = Lock() + + def find_spec(self, fullname, path, target=None): + if fullname in _DISTUTILS_PATCH and self.fullname is None: + with self.lock: + self.fullname = fullname + try: + spec = find_spec(fullname, path) + if spec is not None: + # https://www.python.org/dev/peps/pep-0451/#how-loading-will-work + is_new_api = hasattr(spec.loader, "exec_module") + func_name = "exec_module" if is_new_api else "load_module" + old = getattr(spec.loader, func_name) + func = self.exec_module if is_new_api else self.load_module + if old is not func: + try: + setattr(spec.loader, func_name, partial(func, old)) + except AttributeError: + pass # C-Extension loaders are r/o such as zipimporter with +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA new file mode 100644 index 0000000..56a3d6e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA @@ -0,0 +1,256 @@ +Metadata-Version: 2.1 +Name: appdirs +Version: 1.4.3 +Summary: A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +Home-page: http://github.com/ActiveState/appdirs +Author: Trent Mick +Author-email: trentm@gmail.com +Maintainer: Trent Mick; Sridhar Ratnakumar; Jeff Rouse +Maintainer-email: trentm@gmail.com; github@srid.name; jr@its.to +License: MIT +Keywords: application directory log cache user +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Libraries :: Python Modules + + +.. image:: https://secure.travis-ci.org/ActiveState/appdirs.png + :target: http://travis-ci.org/ActiveState/appdirs + +the problem +=========== + +What directory should your app use for storing user data? If running on Mac OS X, you +should use:: + + ~/Library/Application Support/ + +If on Windows (at least English Win XP) that should be:: + + C:\Documents and Settings\\Application Data\Local Settings\\ + +or possibly:: + + C:\Documents and Settings\\Application Data\\ + +for `roaming profiles `_ but that is another story. + +On Linux (and other Unices) the dir, according to the `XDG +spec `_, is:: + + ~/.local/share/ + + +``appdirs`` to the rescue +========================= + +This kind of thing is what the ``appdirs`` module is for. ``appdirs`` will +help you choose an appropriate: + +- user data dir (``user_data_dir``) +- user config dir (``user_config_dir``) +- user cache dir (``user_cache_dir``) +- site data dir (``site_data_dir``) +- site config dir (``site_config_dir``) +- user log dir (``user_log_dir``) + +and also: + +- is a single module so other Python packages can include their own private copy +- is slightly opinionated on the directory names used. Look for "OPINION" in + documentation and code for when an opinion is being applied. + + +some example output +=================== + +On Mac OS X:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + '/Users/trentm/Library/Application Support/SuperApp' + >>> site_data_dir(appname, appauthor) + '/Library/Application Support/SuperApp' + >>> user_cache_dir(appname, appauthor) + '/Users/trentm/Library/Caches/SuperApp' + >>> user_log_dir(appname, appauthor) + '/Users/trentm/Library/Logs/SuperApp' + +On Windows 7:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp' + >>> user_data_dir(appname, appauthor, roaming=True) + 'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp' + >>> user_cache_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache' + >>> user_log_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs' + +On Linux:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + '/home/trentm/.local/share/SuperApp + >>> site_data_dir(appname, appauthor) + '/usr/local/share/SuperApp' + >>> site_data_dir(appname, appauthor, multipath=True) + '/usr/local/share/SuperApp:/usr/share/SuperApp' + >>> user_cache_dir(appname, appauthor) + '/home/trentm/.cache/SuperApp' + >>> user_log_dir(appname, appauthor) + '/home/trentm/.cache/SuperApp/log' + >>> user_config_dir(appname) + '/home/trentm/.config/SuperApp' + >>> site_config_dir(appname) + '/etc/xdg/SuperApp' + >>> os.environ['XDG_CONFIG_DIRS'] = '/etc:/usr/local/etc' + >>> site_config_dir(appname, multipath=True) + '/etc/SuperApp:/usr/local/etc/SuperApp' + + +``AppDirs`` for convenience +=========================== + +:: + + >>> from appdirs import AppDirs + >>> dirs = AppDirs("SuperApp", "Acme") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp' + >>> dirs.site_data_dir + '/Library/Application Support/SuperApp' + >>> dirs.user_cache_dir + '/Users/trentm/Library/Caches/SuperApp' + >>> dirs.user_log_dir + '/Users/trentm/Library/Logs/SuperApp' + + + +Per-version isolation +===================== + +If you have multiple versions of your app in use that you want to be +able to run side-by-side, then you may want version-isolation for these +dirs:: + + >>> from appdirs import AppDirs + >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp/1.0' + >>> dirs.site_data_dir + '/Library/Application Support/SuperApp/1.0' + >>> dirs.user_cache_dir + '/Users/trentm/Library/Caches/SuperApp/1.0' + >>> dirs.user_log_dir + '/Users/trentm/Library/Logs/SuperApp/1.0' + + + +appdirs Changelog +================= + +appdirs 1.4.3 +------------- +- [PR #76] Python 3.6 invalid escape sequence deprecation fixes +- Fix for Python 3.6 support + +appdirs 1.4.2 +------------- +- [PR #84] Allow installing without setuptools +- [PR #86] Fix string delimiters in setup.py description +- Add Python 3.6 support + +appdirs 1.4.1 +------------- +- [issue #38] Fix _winreg import on Windows Py3 +- [issue #55] Make appname optional + +appdirs 1.4.0 +------------- +- [PR #42] AppAuthor is now optional on Windows +- [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows + support requires `JNA `_. +- [PR #44] Fix incorrect behaviour of the site_config_dir method + +appdirs 1.3.0 +------------- +- [Unix, issue 16] Conform to XDG standard, instead of breaking it for + everybody +- [Unix] Removes gratuitous case mangling of the case, since \*nix-es are + usually case sensitive, so mangling is not wise +- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result + based on XDG_DATA_DIRS and make room for respecting the standard which + specifies XDG_DATA_DIRS is a multiple-value variable +- [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to + XDG specs; on Windows and Mac return the corresponding ``*_data_dir`` + +appdirs 1.2.0 +------------- + +- [Unix] Put ``user_log_dir`` under the *cache* dir on Unix. Seems to be more + typical. +- [issue 9] Make ``unicode`` work on py3k. + +appdirs 1.1.0 +------------- + +- [issue 4] Add ``AppDirs.user_log_dir``. +- [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec + `_. +- [Mac, issue 5] Fix ``site_data_dir()`` on Mac. +- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports + Python3 now. +- [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use + ``opinion=False`` option to disable this. +- Add ``appdirs.AppDirs`` convenience class. Usage: + + >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp/1.0' + +- [Windows] Cherry-pick Komodo's change to downgrade paths to the Windows short + paths if there are high bit chars. +- [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g. + "~/.superapp/cache". +- [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only) + and change the default ``user_data_dir`` behaviour to use a *non*-roaming + profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because + a large roaming profile can cause login speed issues. The "only syncs on + logout" behaviour can cause surprises in appdata info. + + +appdirs 1.0.1 (never released) +------------------------------ + +Started this changelog 27 July 2010. Before that this module originated in the +`Komodo `_ product as ``applib.py`` and then +as `applib/location.py +`_ (used by +`PyPM `_ in `ActivePython +`_). This is basically a fork of +applib.py 1.0.1 and applib/location.py 1.0.1. + + + diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD new file mode 100644 index 0000000..393bf74 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD @@ -0,0 +1,11 @@ +appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +appdirs-1.4.3.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +appdirs-1.4.3.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +appdirs-1.4.3.dist-info/METADATA,sha256=CYv_MUT9ndNhXtkeyXnWjTM6jW_z6fsu8wqD6Yxfn0k,8831 +appdirs-1.4.3.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +appdirs-1.4.3.dist-info/top_level.txt,sha256=nKncE8CUqZERJ6VuQWL4_bkunSPDNfn7KZqb4Tr5YEM,8 +appdirs-1.4.3.dist-info/RECORD,, +appdirs-1.4.3.virtualenv,, +appdirs-1.4.3.dist-info/__pycache__,, +appdirs-1.4.3.dist-info/INSTALLER,, +appdirs.cpython-38.pyc,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt new file mode 100644 index 0000000..d64bc32 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +appdirs diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv b/.tox/pep8/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/appdirs.py b/.tox/pep8/lib/python3.8/site-packages/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/appdirs.py @@ -0,0 +1,608 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/ + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.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 config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # 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: + Mac OS X: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__init__.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__init__.py new file mode 100644 index 0000000..a1bbbbe --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.6" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ad7d957e71637d6f398685490a8f7b5ee8ed512 GIT binary patch literal 555 zcmYjNOK#gR5S47%vJ?j`&r*Y&m9 z0yBw$>h>&!*Dv=N9BX^u_Qm(nq)pf*W`kcduN-udB6PeyoP9&nvL6b&;16$s$fXG$ zL%Zbx*N5o^fB%7h`b%wQi~KkrRz&>Wkbl)GQf(x^8Oj#$W>FtYDRpS2Jl0aG9hHMp zHkFj%l(8hAN%;WSQF0>XBdQnyu^(kqs^`c!?pgiP6vf4YgkKp}be-T|5S!pYc!kDm zK%wCQY>1-WD0I)bY)?;14~cRJp2Cxe5Ld#QI}!I(ng7UFqB9AWG^MRtLnnsQ6jB;* el9W8|kF(D%=$(Zx{e-$XK~WSr?a@4+=l=nvE2jMb literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e444a2a234373b21766edbcdb4a1a094b1a4f1b5 GIT binary patch literal 3077 zcmai0-HzP06(*^l(P(C8$M(jtU87Z#{$PT7#%OL*zzEW8>=Z#e2;ec23IPPI$nj`K zBPk>&&JMId(KV3v!a*lyP<2! zPS#m_p=Zi&)?NFdPsxXbcewYQa8KB$R@me8F&TBgg&D|nMC;yfX0wlf&ErxF`7MP; zXxl%GlZ7}eaxIH26B3%bAEb#k%}}{<7-!j0oU9(DnfOG;WhrEW1}{HuTTxRe2!aa$ z@RYL!3oSnQip(i@xcj^t+I-*C5N0=Y_|VjR-h-NJ%6-1~+zUHj5u1b_z`uqNE+Dq> zL+j%wv(WwE;cp+#9!_UT=Mo&;cn7|H_|y!9CYn~{lr34+sl2Z#B^4lCc{0$}Daly{ z+Q_aPkWS^6zvNhVE315UB)dzo9YiBDpq>nJ#u1KbV)0F<;ul&2rX=9RrDo2aXumW9h+!- z>8yPDE+zPKX#YL%;!{#Nat6I!V2HyRw_aF}fji624z03X7j3)*K51X~48!^rozu$t znx43o3oNm>fAxd*c`R}s#DNr_Z-mn0;E57}UWl`XAkF86T*o>s@<11X5+X?FL8{LU zh%bRA3i_F0WjzEJO@+QMJ1%d8|cv1ANU>Tuhurty1FA zY|a9ZIOn5|970RoX{RtCB!o*+cg^H@6zctR9PL~-&MJ{F@+OMcQTzzRPvBG7L>!;` zz@Q<#KDFu4I$#HEd+YEDCLxeV37*Ka2T>xGkXmX8fwHn&8ab7vzA;pCfJ)yW3FKQX zofy!GRcvWHcmHHOoe0ox*%k4>SY7!j}7gCMJZsyz|^U>FD9^8U#GB0KNA0 zb$tUVx;tnwd1f7C`P$0;3zcr=EpM7X;(i@;w_rUO`fl&;R9z%_WmR7Eg9?MPxBc5W zm)=Jr7+$yBJ30>5@hZ)qUXVQ~WUx`#ge*1w9Q)@MW{Xq>&(bUl@Puqi=#XXD8C_$@ zD}~<3yfIl8TI3ocY<7HZpdcoz-v4^9NO93hKcP87-pmGr+kmg@NGKG)=-apHVH7iza zgorjWt1S>FA=WMjXmGu`1!G6P*?$>8IrPrBVN}f?{1_DS4HO7QzKP;K3KLp>h9whP z5Xi6KQy+mKU7rptm-a2+aVaJ!+xDpK_Nm8Q%cnyd5*NI#NnY&VuIo~l^&Q*vb?xic zO*(+lF5ABG|DE|giegN{Pa!BI=Z+#JHPdi4fzxejhM;shvYSnD3>`1+>`!6r|HjX^ zq3sk6cGU zatwA&x;L@fxL4w=^F1ihuaqdf?3^D{& Ydk>nG!nFaA;Z+Ne0S)@BPvN!x1GrrbY5)KL literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ebd62d6e4517ce2ec6705f66c65eafe2ae8826f GIT binary patch literal 1788 zcma)7&2G~`5Z<*N$8npswERkdd;p|KG)4j>4hR(rLX}X&uRyt2u6NV8wY_G&sYsO* z^v)~5G4H^W_{xb_;Ka{_s|F&p+aw_smm^*5yD9PPSq``nAd2&~xM z=aKRrzufV9LV9tUCp_huinF~cqG)><&3G>yB+82mFZ5Jj@{qYj*yCQDZKgaGa_F%* zQnAQFIc&SX03B)3(t07Hg9tbC!+^~e%;Gi}PP!C`7)a!pbj^xF*Q%f+Xy(AV%^CpS zEgMh5f^Q@C2(Ot8TvM3aFbgc9B45a7xcChj)6STd8y%r`ChRzSCZ&*LqqGX1^h)!9 z5648}-~CSfzDT(bJmQRT=`()F6OsE-Ka^=@HzV!Z%(x2k+;1!K$@}EZWy;)k`M`vM}XAP`W{o3N}b^ zy&MD|2Vqiqs9UCp@LwBN;OkXD zL=n@0Ew4|ooduVfi+oXUX@TBAP&OER8O|zO1tPa3o_1PxSq}mxBIuw-^&x<7MI|%4`kLr&(9v_{oOV#@Jgi#q5w^SL KU|GxN+Ug%}X;qH^ literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e473b4a4adc3e673db13e32e409062ced21d0b GIT binary patch literal 714 zcmZ`#&2AGh5Vm(W%{JYHh!Y2d5C^0jvaXa%4+wFo1edCUBEXku@eX8(|7tr`(-+{v zi|`JJ2iX%65)!Y#iP;}Qi-fHmd*=JT*>C)EJRT8TUk=UkV?@aJCb_;+OrGH9e_*(p zmZYSTD9R}%uZX^%5Qx?zcSuRITQu&_H$+FT$yJ86NG5!M?7Kai@7R$X@IlXPddG54 z4f*g!?@v2+EYl9Xrby(z8u8H$#n+u8kp~^xD^ke#7@gcfClmDjtz*J1KJFN0^n%O= zKXFzvqxEp(wX7bH>#v;w@GW#c3th66!tMp8SD>^9}gmQ7qQQd+>SJY>~VEhc3p3eEM&h-}}FG z6DsMFM%G(fhJ)cXN0!!m3wUQY@IozK_@_nEi}3fu5Yv6WH4bm1ypf@39I zfHangRpC?@=c0w?8bV<$%Y(UO7VHtj2Vr&_Rz@%KBj&3B^FJdpQHT`?qk}V&38QQg ma=We5N6M5N36Ci{@DDLWbV?`mb{x?R&&i%Rd^&Aih9 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da1c8be036c1a0db434ea78a76649ea6e75892c9 GIT binary patch literal 7781 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 M_){F9VTq;x0|HVU$^ZZW literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..601dc3f510134e257347b8c7e860e4f1db548677 GIT binary patch literal 2181 zcmZ`)&2rl|5C%X>qG?%m`ja}Dj*Ivd&BRisz2uN~9A}cY7x&qnUH!VT5fW&BKF`G8YlQrTAIr^$ zk3Hy?gHS}#gp6p9Qt|^)OnH|?d752#Jx}?Eq+R;}yGWasjs5dN+n;`p@O!y=@UaKo z?t{>zM-}NYMd7@&*7KFGYL}!}Q+3sVv91EO24h2gqSjUOlJ)|%p<1xArb4)Jv;6F} zOp?BgPTt0eerIH!Ya>r7At8r$I07x7RLfkNY@8}C`5@<6|5!%_pA6$@$R{!EDzxVM zRGaf+7^g?vXsLLd78#e$RDV1eX!DFqurL|wlovx;@B!S)W6Pr?vl{k;MYN^QbTlqB zToujX!Fn--Guj!8vb4}?VR<&F>{Qk}q0_zs3$iFo+y@&LU~8V6>@0>001nvTKtr44 z9C11X6`T3-Uxp5lw3d%8oFC~?UmIH?kX&WsK7e*6Y?OiVr$V%O0({Y4ZuB5N;}&>Z zhbGMmyjDh0tN=6cIp=mLRW<=%+~Mq0#PEd|4d)E{Yv^_hL_sddj0ifTAlZz8^b|QH zH}s(G8{Aqx5-T252=Gt2wOTdE%k9;gh40&5>06x)N(Os_#p(?)>u}>graR0=x|>Q9 zqgT5Mf*{HAZZwo;RLR}QsdiIcK!9~SMRwNBb^fB8#Qkm#0h6WQc3yOCT=Vc&7oW_L^o9LQ42tor|r_--iulNs4KsAq}I^AqcAFsse_#J#ajGloN1b77* zih%@kcIC|&LIlYEH8D?NtX;$F%pklfuyyD7(#MKfL9R^=iZu)B>tvkhx+pxYJ*0=zaopUv5A zuVQz1M;oeUh@}Mc7V`puYi01VLijzF0_VM^_b>4U7oGqB literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65df53e7a40b87a4842697d693640b77d688290f GIT binary patch literal 4206 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/_cmd.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/_cmd.py new file mode 100644 index 0000000..ee8d60d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +import requests + +from cachecontrol.adapter import CacheControlAdapter +from cachecontrol.cache import DictCache +from cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/adapter.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/adapter.py new file mode 100644 index 0000000..de50006 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/cache.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__init__.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4164bde5c9213c12a3a09316bce1b65b3b82f54b GIT binary patch literal 299 zcmYk1Jx;_h5QXC;1qAj6Tp&d$YNs%Q z!VMZ9K+YoCy$*7*28UUM0Auza5HPI4=w}GqJbQOBt|94+LlE*!ykdf70qI?i-s~X( Z=i2Ga`53mlqf6`6yTPk+QYwp{vOi@LQ8@qr literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b14fd089377ffc291cf07314b23e243ed76d8410 GIT binary patch literal 3273 zcmZWrTW=f36`q;BaJiyrSqL1*b&E}#UTDN(>$rvE8bM;gE?lT2Dm%4J6j-b|LzB{S zmz`bNval?Q$bBmspg*9H(5Lh_^dY}vUi+k<(7v?anKdcNUSiJN&J54>JM-o0YRK^Y z>!*4A=^A7Irpehaz~pnZ;*TJbNuIJn-SYv*T%=;^3>?m+Bi+=UdIQgnz0{vJ1`W;* z0u^xfm}OU8rkcBjW~eUWXfBDyg#aL|~3-^KMe8&15)Mm|U=f%{(i0o~B9n%(i1YXWPZ*)^Zm4%#IQ`OB9J;|ifU8!EEG@o^c<3vwudVOfOu4k%DX0z@_neTUJYIdue zPM&pVugYy z!x`hBHO6EfAS~J*vYpb zy&-vH@lg^|s@b^w8wQmp*=|!`uKc>U@yNg82Un$#PRgfZj^x7FO`WMbuT$(J#GiMX zVx=#=Lq2boUe!FrSwz+4C%9S5Dwz9O%ibO6S=E^P6|Y#_K!mb5s2tE{<${Kl54s{L z68+vmcQeVdyo~k=MJ<*S9jEzlH%c-Y(I6hCNl`>){#=z~r8N|#1P!*ZM^?ai^*6gX zwpcj$XBeINdi_WDZbuKYDA$N1+++U=S4B%3Mz8X{Xu4OF(Kvab&YdO+C_JJ`R+I^n zUv5NC!97f}#ZojWqZgATnoVZ6&z+5EY00&?=^RU^Wy0Sj>7KIbG6)t-`n%9_aA`5! zn395vnf@L&&B}x6EZ3zys0olv6Fh2I=K7UsjB<^H(RHTT6l-AD4nn%8wrVFdZlThV z{t)N&_lf*~$VVW9)>(JxAJRHWRsXvWpG}6!=4wqYW6uO}Jjo_y9N)&Q_z?&T*LWZV zZ}Bx`i{RpaZlmqE+!q0Nh0p8X!TQn}8;dK3FhDVYzvPvms`h8`0W!K0&-wdo?v!H3*+Ka4cq3jpe;0qH@E5%kf`*Q7 z|J}Ihq$oAj664O2a%|k4e3Dt;bX-lwG%kUr@kvJ|jWB_M?Z zq}W&z z3-FzVYV^LqX~5bs|N7e8EdgyifViCyrdpeOm3OpKiMoW>#v&6fMr0D*fdHLWZ4m47 zV4CbIqsHp&HJf>Kkhg4;3rW()ICqxj1ho-DE-U|Yh+IBAGy8b2Y zQB|#p%~YpQ8hC+{9Z%961a1 zv-c1eF5=?GS>v6Wz^hGQv4`xS+eAJE={ToKS#91{0Z+D6mFf_@%Rum{6ytX`e`~gm zcVB;p?!F4r>jC-zR%GEgHennC8u#!Dh)pYw|FD;&^^X1tm`w}N544-20Oiu=YAy5~ zy6!F!N}e;~SzD8t^%W2@QbDu8d-E{k>_6d;1&kgvf@aXRT<;i}3{CeI?}5~CNBB}9 zQpvc$4}S3bZFo^<5tXwMm8l^;Zz4jE=owzHGRo`CFSoZgLR)$sjVDDUb5%rCc2!p3 zsdIW>?E`~~4=pDgK=5Rm_R@Gyr&jHbV;qbJP5MK-W#jIQ`lPE_15aG$F>%Et&|gRw z0!`-Oq4aC?oeTOJx*GC=Qtg*7buz1qnOEOT{3d+!Uc=MdN@T;sG<$GfUH(qf!)68< m-TuKDnU*dw!JXRIpHWRIE`bC*;4RTY6BxBc+X*^rkNyuFr|$Ov literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b30aebf2e7846658b7460382cfad8323ca6754c2 GIT binary patch literal 1559 zcmZ`(&2HQ_5GF-QD{pok_a|+7Dhu=?pk5W|#fKm*ngD5mVh=TP5l{$L4t)|`d+ICX)EUZxw?;~UH=Z2;uM( zOnU^2Ac88gra7f32P#+xdEjNH*gDKZN?s5Vis*`nNQUoO9*Ovvq?3QZnxwQ(M15A< zS~p%UopkkDg1q;0Y2~xBTFDAu?hZgTAb1LbBsmo%4+Is#70H=kB7{8@`yv*TD+>M+ zu?IJ?n2HCmPsB{jVNXN^I3D)X-=(PS;3?Q~gEG!%FfE3pqa7)Lc;hRr(LNEDTxAiSE;=T=UETjUQW)2VU`+fv>U%(tg z`^ipd2eXQTdK{Qv46qL_2Vro$CC|wp2k)SkA;SS?n36YB0eMb?%U^$ys+ESHXu~Td zv3^f^sT6lB$sya8*9|YZC|&sq+H=8QTFKwmZZ+k%qbfHJn)#b$%7#pYXl4-m$4K>& zck>mft*;EWPcIL4h>>7%Cn+) zvnkb}F%R(D*dzu^X^732C_TpI&a;<%S4E(}AB;t-BuH4orW06WgPLU;qqmcd+Zga> mF!R3n^G~atKgPlz42H~`eauszJQ+Yg#SmL;&KXqrjQtBN7gAgR literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..607b945 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from lockfile import LockFile + from lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..16da0ae --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/compat.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/compat.py new file mode 100644 index 0000000..143c8ab --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from requests.packages.urllib3.response import HTTPResponse +except ImportError: + from urllib3.response import HTTPResponse + +try: + from requests.packages.urllib3.util import is_fp_closed +except ImportError: + from urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/controller.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/controller.py new file mode 100644 index 0000000..c5c4a50 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/controller.py @@ -0,0 +1,376 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/filewrapper.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + return self.__fp.closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/heuristics.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response): + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response): + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = { + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + } + + def update_headers(self, resp): + headers = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers["date"])) + last_modified = parsedate(headers["last-modified"]) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/serialize.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/serialize.py new file mode 100644 index 0000000..572cf0e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/serialize.py @@ -0,0 +1,188 @@ +import base64 +import io +import json +import zlib + +import msgpack +from requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/.tox/pep8/lib/python3.8/site-packages/cachecontrol/wrapper.py b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/wrapper.py new file mode 100644 index 0000000..d8e6fc6 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA new file mode 100644 index 0000000..e897b3d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA @@ -0,0 +1,74 @@ +Metadata-Version: 2.1 +Name: certifi +Version: 2019.11.28 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +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 :: 3.6 +Classifier: Programming Language :: Python :: 3.7 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python2.7/site-packages/certifi/cacert.pem + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD new file mode 100644 index 0000000..380756c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD @@ -0,0 +1,17 @@ +certifi/__init__.py,sha256=JVwzDhkMttyVVtfNDrU_i0v2a-WmtEBXq0Z8oz4Ghzk,52 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/cacert.pem,sha256=cyvv5Jx1gHACNEj2GaOrsIj0Tk8FmSvHR42uhzvlatg,281457 +certifi/core.py,sha256=u_450edAVoiZrgqi6k3Sekcvs-B1zD_hTeE6UJ2OcQ4,225 +certifi-2019.11.28.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +certifi-2019.11.28.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +certifi-2019.11.28.dist-info/METADATA,sha256=K6ioZZT9N0bRETHmncjK-UJKAFIVF26h1F31dfDaV5k,2523 +certifi-2019.11.28.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +certifi-2019.11.28.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi-2019.11.28.dist-info/RECORD,, +certifi/__main__.cpython-38.pyc,, +certifi/__pycache__,, +certifi-2019.11.28.virtualenv,, +certifi-2019.11.28.dist-info/__pycache__,, +certifi-2019.11.28.dist-info/INSTALLER,, +certifi/__init__.cpython-38.pyc,, +certifi/core.cpython-38.pyc,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv b/.tox/pep8/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi/__init__.py b/.tox/pep8/lib/python3.8/site-packages/certifi/__init__.py new file mode 100644 index 0000000..0d59a05 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.11.28" diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi/__main__.py b/.tox/pep8/lib/python3.8/site-packages/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b79ff14888ab66fafda832ec25581952a65ad96 GIT binary patch literal 262 zcmYk0F;2uV5Jl~5kkG<*Tp~q0n}s4s2yp@$M3crc_CO4YZH>*sawG1*Nzzhr1uC4~ zhA+(<{rS@9->+6nmi4vv@*?l=+5A_L%}t(omSLFT0~>kAIWt99n8h8d${(Jiicd#x zJraH_H|yq7G>zD_x7DI6wI`(c&2%E=7Aacqr2J%5=Gz{>&(Ql3!6~xNAc4Ux4nBbH z6^#ehdLPvelL`Su^6wBZv@qBQ2)opKcP?6pHenrtK_eymXhBNrY?4xh-E@34 PdhN(`M*m8$HC%o3HH zlkvuKnoICeSGshI{P7QYeo^aCG*-)S%FD0`H_cvAe7R_ zan>a^beR*e?gmQxRy5EJIj^(<&d0Q))hqD>-0)Sg+BU#i;dQIPGX=L`tYfkkzFG4` zu3D28qHvCt(cUu$?vNRM$=o8=wmm2hS&zbr!{ pbd>ll%;U5haIUQ6-1i@{x?D;7M?-9M!=ts;$Gt_XA=&0I{RVcIgFyfQ literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi/cacert.pem b/.tox/pep8/lib/python3.8/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..a4758ef --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi/cacert.pem @@ -0,0 +1,4602 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- diff --git a/.tox/pep8/lib/python3.8/site-packages/certifi/core.py b/.tox/pep8/lib/python3.8/site-packages/certifi/core.py new file mode 100644 index 0000000..53404e1 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/certifi/core.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return '/etc/ssl/certs/ca-certificates.crt' diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 0000000..f1f13a8 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA @@ -0,0 +1,98 @@ +Metadata-Version: 2.1 +Name: chardet +Version: 3.0.4 +Summary: Universal encoding detector for Python 2 and 3 +Home-page: https://github.com/chardet/chardet +Author: Mark Pilgrim +Author-email: mark@diveintomark.org +Maintainer: Daniel Blanchard +Maintainer-email: dan.blanchard@gmail.com +License: LGPL +Keywords: encoding,i18n,xml +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +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 :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Linguistic + +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 0000000..4726bec --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD @@ -0,0 +1,97 @@ +chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 +chardet-3.0.4.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +chardet-3.0.4.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +chardet-3.0.4.dist-info/METADATA,sha256=o6XNN41EUioeDnklH1-8haOSjI60AkAaI823ANFkOM4,3304 +chardet-3.0.4.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 +chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 +chardet-3.0.4.dist-info/RECORD,, +chardet/gb2312freq.cpython-38.pyc,, +chardet-3.0.4.dist-info/__pycache__,, +chardet/langcyrillicmodel.cpython-38.pyc,, +chardet/escprober.cpython-38.pyc,, +chardet/version.cpython-38.pyc,, +chardet/cli/__pycache__,, +chardet/big5prober.cpython-38.pyc,, +chardet/langturkishmodel.cpython-38.pyc,, +chardet/eucjpprober.cpython-38.pyc,, +chardet/sjisprober.cpython-38.pyc,, +chardet/__pycache__,, +chardet/cli/chardetect.cpython-38.pyc,, +chardet/utf8prober.cpython-38.pyc,, +chardet/gb2312prober.cpython-38.pyc,, +chardet-3.0.4.virtualenv,, +chardet/langhungarianmodel.cpython-38.pyc,, +chardet/compat.cpython-38.pyc,, +chardet/euctwprober.cpython-38.pyc,, +chardet/enums.cpython-38.pyc,, +chardet/big5freq.cpython-38.pyc,, +chardet/euckrfreq.cpython-38.pyc,, +chardet/langthaimodel.cpython-38.pyc,, +chardet/hebrewprober.cpython-38.pyc,, +chardet/cp949prober.cpython-38.pyc,, +../../../bin/chardetect,, +chardet/universaldetector.cpython-38.pyc,, +chardet/euctwfreq.cpython-38.pyc,, +chardet/langgreekmodel.cpython-38.pyc,, +chardet-3.0.4.dist-info/INSTALLER,, +../../../bin/chardetect3,, +chardet/chardistribution.cpython-38.pyc,, +chardet/jisfreq.cpython-38.pyc,, +chardet/jpcntx.cpython-38.pyc,, +chardet/latin1prober.cpython-38.pyc,, +chardet/mbcssm.cpython-38.pyc,, +chardet/charsetgroupprober.cpython-38.pyc,, +chardet/sbcharsetprober.cpython-38.pyc,, +../../../bin/chardetect-3.8,, +chardet/sbcsgroupprober.cpython-38.pyc,, +chardet/escsm.cpython-38.pyc,, +chardet/mbcsgroupprober.cpython-38.pyc,, +chardet/euckrprober.cpython-38.pyc,, +chardet/langbulgarianmodel.cpython-38.pyc,, +chardet/langhebrewmodel.cpython-38.pyc,, +chardet/cli/__init__.cpython-38.pyc,, +chardet/charsetprober.cpython-38.pyc,, +chardet/__init__.cpython-38.pyc,, +chardet/codingstatemachine.cpython-38.pyc,, +chardet/mbcharsetprober.cpython-38.pyc,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.virtualenv b/.tox/pep8/lib/python3.8/site-packages/chardet-3.0.4.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__init__.py b/.tox/pep8/lib/python3.8/site-packages/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8088c03656f6d142de63696de36549c1a6f8ce6c GIT binary patch literal 855 zcmYjQL2uJA6t$fAKx{)Im()wVHY16H?N06JE|ed# zi4*^UU*an#{sI?xc2?Mv{PI4(_dUO7zZ`9EM+oG{E>G|K2>mqRrZ@ne!;(W#Im&T~ zDxBcTNgQmjQ@WLxc-D5yPURQKSGwh9+iaM}fz>=>(DYQZguN}E-EeEWJ z%FXemr#dUN##eZazu-Dl*q{rf{5873D|{KO&=tlAtndm!mCpIMh=8=^5H(|j)fvx= zdP?|-#Z#!bCdW&~h*Sa`gUC`w4HdMqjuadtlZG5Zf;N316S1hh6+)mC!oU=1l@+Qt^R8+0*XV%rPnW9Y-4-{X-4QqyRSscgB zQq6e1HyFmUP^{n3>?55rX_;_VoTf!xs5BikOYOIZKQNPU7ZeI29AO{(e?m8eZ-m7T z?CwMJe#WbYDq*HaxS*1q`DXk!Ewrr$*YhXLkO}xFkWFH{yP>+^(BadH=kt<1y9Y>` K*e(-jUwIM-7VeSAYe-#kQR~jJHI>sd_K?Y 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 o8_}sm$KD-2F4$|})i~w5_iW#;vfT<5b zaKfo1IgKer-H}f2#;(;}>E(XxTiugE-ibSu91-sG;EeD<(6t+fyfY<(@FxXV16tpi zETzc~Rz{2$iJA)YPL(sEz_L9qc~;D)CNW}?q>HQ&uzT+yo9`WF+Nf-{G+9}^EE2iW znFd?`;PufSn@-r|?cu98DFpaqxK}Iv6cj;X%1P{;lMj?r?wp0OD?ILU?~JTz?1OHz z20b_@9*HsQPTj@uO^PX2a6M2*|2Xv{5QZ3fO4iPW^OaCyT;r`_&3qHA3H&>!oFFFDs!G;7{t1v8>1pV+tKAANMv=iwD!W!hY1dyoCZw5QY<>YF`O0%q6Wo zE#wFIZ!nh1L~F(_$uAi#%3MT6qOyVu6>;%d$g+x306%Z!Ftw&(Axu(L(a4lvqDoZz zk<4aMwK9vccrx0LbY{e`O45(XTxfff3lq%%p2~J`RIOA9c|L@xQ6Y4bc4+mz zwF6$&E{M8+)yq^!3FNq`e-n=&2$nw&K+*W5L)r@*+I1aj_mO6|^4S#xO`jBERBt!r v()if&=CN7o)mwPD&9sJm0eI2CL}aFQ-OA;rA>p&8z~}cdAtXVM+RyzBqQ4X6 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5beee483859e845a06c4766990e642ce127acef4 GIT binary patch literal 6225 zcmcgwOK%(36`mJgdQuPTVLLYcKw=iL<=A!WrfIB)Wm$<$xs-$^v*>{09Z9tKknfCY zi=|K$agjxTK(lFU1Kp?vf_9%pix%i#XlIq8E3UHdCjGuU6h+FU;G&L)xM%LUkHd4% z{q8yE&T4;ukA~-qs}<+37d7qQWLh5!%ruJk4-laVy{MIRTQ3>5Q8H~)XPZ&9N)bC! zirUdq%#NuxvluTW>_n-@?kV-!y{gSB_LchW{?dRwP#UxcRa>N(EDhO1rD1!xG-8kF z+JYvcBKA}hF?aM6(>?({E)w7q?g{W?;Cn1El z0zahqli-KN2>21jpAw_XTKYs?$MVu1?TE1KsECN@Q_YTvn26&I*oYpy6QWo2;oT$p z#Q@&DVo)UU?h`}U`r%+=ZZjuu7d&4U)^_|tr94y46?eUYSI~g|jn5bURUQ5Ot6LjC z9cA_Dt-1*v@&wGm!#XvbL-DSH2(6|$A%&)>8;Y8WT8c($+Oz0$jfY@a+t)McSTN$` zp^4*HoOS6waw<}|GU#>u+*;9fyh7CtPWrpsg?z5)h!%AnnS<6r#1WOU8}wnmj}a8* zVYU(#G7;%|uD`Dbmgg4N_ci$jRQ->f+N_k^sd7#h%J{=6;r_%eR<@@&rxeo5dDV5f z?E1Ow?Wrq%<;m2xyM1%2SXi6d-t{*tzPt6prAHG}Ey|TR< z#2u$lF8Gdfg%%qC(afkGji9Js_1s*SJ-Ko)v-<{&L7LFj1{k2aAT@-E&9+i^NDqktD7ld2RyQ#ID z2ZL71DfbD`T_|s)M9v44phP-)2%KQ-{$ghF{_1___RPwRvvM~(zkGM;-t8c^yqcYN zGE0(p4dROXcz!u;gqGChQL7Db2M!hBYQ13)%^Cyn`d~Th>nJQ}nbo(tTCiP4n=RYC zSRdrV63RYX*0Lr?&;Z?dAc7O~nWfc*yGK^k>4*e_8x`Mi%axstO^5aonD24dG_!iC zyO!;f@@fJn;bEPsszbvQB(PCwBO}kFu55N-!uZ;*569^rwWPd&kp+}ckx2D?cSR0B zpGo)AYn5{)*KvX#$0=3B4&1T>hwD7r$rZyMd6`OlizH2QiR3H^eT96Bek( zT^Df}FIq8lu#!1SV!*D!M3dT{0S9cr(OwcJYZKZid#p)qToaKAtccE(D@(^R>ZI5I zhRO9GgD7uVf6iJHi2J5G%W?{>LC< z$oJaC9ioC3eM*^4RIufhpyFhBBY6$5n1;$B zEa)jhSR`0e&W4xX<6-d`Mzq7?LU-LelUr}fiKWup=_?eh3Y}|Ma=;4-y=;>umITfZvA$s~*JJzZE0VCSc zbFQ1_FM*wpAgwEQ9yGA??u*zF(Q(GCc1*>HDO@Y!jYyUVBUu=~e#e#3?bLrwLXg#` zL0Y`f4A~A|=uc?(Xd?|U3PaeKQ9a*v*)IVk?!xaWwh1J*yc!@a;|s)V0McD390G~A z+z?2EtSL9d>(B8(`U^%J0a7>3I|GS9(L|x;JPFbjNLS%{EZml^9s*|1D!+-=C|pw( z?-+Wssy8};&vN5Pk1)a#3EY&d8XZ>81X=*dUfe^=B7r*Y4(YyDi2WQo)PGCz1<98r zUy(2vhd5gx`!lk{Svqoqk`2ZUKKY$FleibcRlkd)|cSa=9$TCMs%w9u8 z9!b6t`c(2AQOS45Kv;i<$zi&rG9{HWH3K0&;qa407zi)2*1>6giS|b9YstF1tmY*U zLhJsMGMfltOD28VPPjXH|1rPDNdrxi7LXjJdbXtMQ5mdCUYWPrJsWHM+N-)~a;Xv+ z<}P-84S`T~r~sv66T^}ndsy&PyYe^6)g;j#L@R3#-Mp_Zj^Ry=8Ht=G;Z8_GSyI~; iJ1L9tWCii}!VB;Fw5i9~H)=F~R&p^pqJCq^$^Qbz0sM*p literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19c5e789040e4f25fbe2bb7dc4a21a5e4dfd0bb1 GIT binary patch literal 2256 zcmbtVPj4GV6rY*>gdfoYa-#S)@^4(%XrS7iN46W;y;u7B4^U;GH_oJ4-~`ZUJDK`r0ro>Zuinmn^&}B92S9{ zjI}Z3ToFmx8}>3Oiv`*4WWA?a4kv@6GIjy6#j@PeHj~|nwpNydu_%12(`^%AgBQH0 zO4&)U1=2b`a-5$**_Z)b*jx+T(F^JsbVl9P9DT zX4>0oj`y-Bqv0p(H=DMX>FeWmXQ$oO)_tjT=H6CkT?$ue&iZ)IM6l!v$dbVLG7s^a zUjA=v*N@!o5Fm~oiZMll;%py)9mV)S95Tcg@s?iB`u<(^!_|GBb8{)@^EqTe201?O zd&>Ki39Q_`t2K9JNG z8_0Dl_MCOaVpnIfGa7F9lpc0;QK$UE8#!zb^b786FU>u+`2vpkn9g!lE<$Im&!_L4 zVeQH7{-4oi1xL=!Hs>K15tYOQs4^F!zHa3z#y$hRZsl2EI@;(|!4i;&Tv%riD0~3U z(|wT(yR;kTqR;Iry$=AML%#3jp1lU$%e=n7Bh1%16*NHA4+Ro|1kg+cGa;ZTB;W|R zMM~TxxJ6hODQ}0HkXGT#>hYJ@6}zAr_^o>mfewsu%>m9V!@9!X)>;_?LJ{42__%df ze!E#FIk40vi?H=@Q-1f218NaUHyHaRJfp3>Ok>EHH?e`aOw48cIPGs?>?@GH3dS5v z1z;-XQq4h^_##FkUgy(`X8?kXJOu=5K2%FC%)df_ql{`Z<9&fpttgJbk>){rR{_7u z+ZV1feXI?Tl1DD|w{~yjUO%*(7_A&c%7<1x6r9ocLG6(3(|Vc-Xa=;9`-eU%MCASs zGdFS{sYQQ~KE6Pgu)in|XXC^;Y;|AW|6{uH@~_+7pH@hm-R{Cz_e>k_*|p&)TPy2+ zdLAnN$7QwlIrO+*hLtj8E)jd17&VC#Sq#%r7lmhX6oJOoXI&{Ijd=%}w_my$+`1Fn{|oUVx>dUH1!cz4 JVRc^j{sEd`=MDe> literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d4f8ae75e70932742854ba823709009f058dcc7 GIT binary patch literal 3488 zcmai1Pj4H?6`%b_Q8Xnxa_lrpT1=7_4UnCXECmJVx~t{RkX&oI zOV1ANP@qr&cE5)V^y2SOpg?=+XV_~`zVs3xhhE&@nX-5iW`FHOGO{HmEnT5b%2@F3{Q%uh_K5srlYf*4Lc>wy(0uv!oxM9-d-ry}Q6%G~rHI|w zTy(3%^h{j-qLgHx z^`%)qUzG7Bf!yBd;tGz^;&u@>k z^wT6B{R*5J8OrQc>+qv_MHlXv)0cFm8!`I+0RzpRu_H@cC&+8i**>zz_HFj?=8-eD zPMonr3H8tRyX=K!G0ZTh*^xVTPuv$Q+a9~ZJz#2Ec%ab^q#KJpzB)F^cKAzxqQ)of z_mT_Qi4w_mPf7Hnfy{W?;bdKQt>g>hK`&@aeT~bc8%J4>PbnFH5NsUY+Gss2nWF^h zD+zRzCP93S&rLbOAqc^MjekGh_{ZO7`}%=8kP0H6NQDf9)W>CO8O)BOKC+uAk86*3p+UCE z_j*yrJHsR-BRF;(WOQ6{o3K458cxx@K+lBe@~l_}ndT|{dXDv*{1y%&^`h=D9cIw) z@sNVvcz>ctd0e0*S8@;sp%l0pG6&v?CC`wXB@ePNie{eOtd$!JJIs5+k>_J_0qh_H zvQR|>o$;r=DC}{O@+8%K2zTF^-0ooxAjD zEywV#Px_rj==ub2b6)q&-d{svb`>4FSn(>B{n~Y^)>@@*U9w!OZXbTU5V#8tnnN!k zw?yw>Fe%V0tRq|4M~=pWKSl-e%mRWF;E|1iQ{lYB3}(Ht2dvuaI`JoU%skBQiV86A zi6x+Tee9h$K=nHIIR~yf9^2V5P)#QR*<~I8MN~~jFsC0mkJrI@GUXJ@Gfw2cTJTS# zyz*A>OFdLchOi3L!HD3$zYj?5?-%i{P$NWGrep^SqV9C8PQs-;Y?>H&kO)qh(&Um^ zbWT7+Ax#m7r1DhCgkQgLie(mXx8f{C=obo1BlG`@i28jgB9v6|s8p;iJ1K;wVK`K( zgxZaB&@#y-1!%-#&`h&SJJr1@Y)Wx6_!v(V5f1p?+TFT$@06{dA$w_#bW^CM;bY@y zK#{Osp0~fhjg*>vQPiIM`!gT?M$!AFsMs-hyJ7n4d+NtTChYA1P(Q&JwGj$Tym7Hi z)CaW6(KRZ?Yxg0>txA;mI_T!^K*=Y$OG>q>2!@4ldv5}_r;+aYlb6AdrKa>w?|nu` zvU&vwbL~s`tD-2ZTCQ`+t~+aX&8j&rzK4y4*jsdJ1NHJnMgNZEHQ(>2Vi;33T=)IQ z!yqndc1DXJ$=WgDuq6_uNcUjC2p%gDi1+qG+6)v;mOsour>r?zEy;ccot miVWzb8=$AIVS~rbUwS>h;3j8+5Ox%C1^fIP$;5o`3!T literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c06210844ad24fdd88cd05308c778a1ca452fe0b GIT binary patch literal 2915 zcmb7G&vVm86kbWT<2a6?Knp4D%=Xg3Q(`m20fyymhuDl0L|zytYxZW+t~q&nrsMrwlq9Zp#jo8-V0H)Z1F^CV5> z$QUi%Sh@M`TpCz~&DdchV=cO+4pfq=-PGKad1k6pIIW~hCT1X?z}(`2c&xHLQ@~AkEpHvySG{=UcwbzVpjZ|p2Pp|-;!TzFE4v9AABP=^(P2q@A zg{?D}Z`PFD>oCyHlLy;RDu{cCApvH=K2)eUh!;zoxiJDK{!_E3(nVz$inKg_ZX^Sc zqU3=}6D^^Vk<%Rh^jSnuV?ngBa;yruYYgbnCUeOsF?vvW_S56qt+`*BPGaN1i?;V7tD@HwrIx3_=Zu9>X_KSk_+aSDyn6YbBMl8a@^6rYsmNi@qsIggbg z$Iir7k#++4sIF}$$-Icu8Ip{cJr7r(k|Uc>NQDB)VqpPw$Wssw6_XA4Xzb(Ws~>s~ z&>o@{x6mDVMYrJi`);pSCITCN%?}UdN8rPq{W%=S=EnCq9g^-rL zD4tmxQ36Czu^vX4nwTgmTeOOqChFX{ zzF#&9la4~an7kME0^I$}4afP!3^Qeu3_%Yy?zuFd4$0c2>NjIv+RTho)9G;F@)yIY zncf|y$?kA^=*D?=dvJG%bTgY%6+czD*7ziHYgpaD?CbmnA50I)!z4>w6x|`-y6A-0 zn*VjZm)FmK5C-*$nAoZxdM62(eu8mgpC|_DJL0{!)ekJGQ#Sb`vu(V;_bfi0RrE}O zy-34#bl;*CtgiR++7cI-#0B~3gL^Fh7=t6R5AipU1{>m)kCEs6{otu@Z)uF82CoNL z_t8Yuq#Zoh*brARdsVy&c-+J~?L!(JiH6v3=++&C$_Vt)UfBxQ;#3ty=4?DW;VQga8Y#d~0efhb zrd7>NcVbpeRwlu5t!eJmfojle+BPNCy{na6wZY? YIwf{3++X>>_QE3}iy-uw1T%c`LYat$Rk+|V9m(J{T!%pmZ*xhSf!fi?T z8+hbD_)F&M$-m&qsvZbKjEOzznyTtYRekmK!P3$qf$`&c$zFE|`H4n*cwoGNskcFJ z!l@)VjVVRlkxuT$uGL-X<$mm2-IGDyi93|MC*0@3DdBrlM=ZqXuPPua$#;)+V%e_-Fr?C&Z z%^URKjCdr*ygT(R8>0!CVi8vZbqs)0KLcTip(kYSoIBqMCB`-09Bk&BU{2uQIU(mE zu5bbu)4kq8?dxeJlnUT*9Ws^`nPE)fg~~_YLTd3~I#&+bYrKUUOAxqYp=w_VEzAY2 zJuT!R{1+HYWui4>7vy&yP0CzEMWV8T3l(wkRmif6QUEh=)rb0;c2~3R&q04m94e9Z{ z7K;6=O8X5i8;xKWN8n zZ~DKu!EUKUQv5q`D3ju73Rpy~pf?J=+RzKJy_g?k^&(?=$)^(aE@NM&iELIZbae<& z0x8T)-Gyt_8i;!7vY)At5(sh)z%p(@6fB1xgQD?ehqN0y0K7x3AE~y20JQ1TFlx17 zn8p{EH!sfeufCm+FClAMtFR??0A3AjM0VP%Te)0!Bz)Nv`05cRggod{`?-Gr=%y1Z literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd33800908c0beaa1a281403b7711fdbcc6b663 GIT binary patch literal 2653 zcmbtWOK;mo5GM7YD8|miMS-Gd(LJ<41vFC8UII5LtOxBdmMKG|gN7H1=B_0s6shcz zNiCqK(l_< zkh%u?4Y~#Tmegx>+ff=f=iF$=F-gxzHetj}@~MDPkdc5hk_$#b<7qygq z%g8JUp9W*rG>qLK&n79~CA}aaoj6FO3Hg!+N%M5A?v1BG6gR_k+Au=6;Tuf_Z4bKm z1O!t&74Bc6s#m5ZuR_aSl~z2BR^hx_VOYs5&zvmC*xWG)G&e{xqd|jN>ief0hUF>P^k}X&R!*@yXEi+fLWAin{4^*TVP{R)jXZn zygI9}YDe)5W-zUzuo{eSP#wHgFK+gOWSm2s>_>6N`25McdJN)5&Ld}Xq98Ar^b|l4 zpOY*lfm~@cI$3+Pw{qxcv~(md!|^$$)j|rq_~JH-&p_CXEnbCx4!NlC8VWSlf^q?QFYw*&@HOwa5xxxn&mqG1;R&g-Npt8_;dpV4DUTO z{R+f&Y07k}(b_BJrRvpJX}RODXE{qk){maDIGUs>o&Rt>H1TUoEEWMlh6+N+X>yjv zary${Op-1z@bf6m1xXVq4#>}MfwaJbhZx7}hGXnq=mK+1{{;r1BZ zN_qapCP2;28Fs_CGWK=bJZQVtBh%AQ?7nqq_8)uN>R&$|IKUx~%;H8E2SQ94FgWF( z!nT*rC@X|yiI3sMH_!#r#hSQ*B}yfgI%?(Ab`zM0XpN~K7ky}1*y zaE_2a@#B0m;Nw2@_`C6bmy5e=;2y#v?FdZ|x)3#vfbfOMqoO-8%djsM0g39$`&C=0TX|rPW!1Zq}blKg&Pn2eOn4I z>V<=`yX^~G#GX48Hf)dkgKlESVs8Z7@h&Mq)E@|LN1>fW>Zk!1VKV6M+eu%(Boqu2}$UL9BMn-gmU@|AgxCxgy|EqV z^aLbMzl*2eC|d&AA5YiH7uG7UHaT6ZW@{X8np1RM(JPA9Cgk|N6M~oqhiGkpWyuEs zvaUj3eId=oqoI(p1n*BR#s=XaVJt0V24-;}%djF*PXP3zR=e40vQBGl<7sQP)m%wU zaFGbPL?g&N5(`DG#}76hpsXz5r}<=kv-zMcF<{d<7rgjfz}d`;Mq!d(VVP?MXCA~* zERwW#Higf{cu7qbV<@FL39d=%T580?@2dB`qG^FK&v)aPu~+2p-9|qOL?d+NAml1wCN0x>_#wq^PJiR;?}o$D%-|j-ky%4vp*Zz0K{#34YDnF<7XMXf0Ww(130fkTzc z8#v$L19!L`!e*{1Of^GUSHAnE2>@rgL;6v_Vn(wJcSDj-9R*Pvx-k`eB;uk z=OzEo-O`5R>Qt#OZvmgFe0H}r!)5E-y_X$4llt#F(Qc@(EOOd`$^;!_Rd4rRKm237 z@cOTBdmy2j{1}FReND9|5{Ra-iwVpVYapi#Nx%h$HvZ_6Jub>$$ZI*+j9q!-cVH$I z;P&f*hOY$f=L3DB%j!hmLHNOVtWC5NdSFb9MBg!XHQ5J9>I?vAkewXY?h%bJ1Z9rv zyHx&`m^*m@rv)Hy($qy zZ=pl!$*_78c&8YO7fF^oB!Vl=H8(fcH#3Z*qN&+l-(qV``Mz4svW(f<>cCuTt*$?7 zudvpZvzXZo3r}_$3$m)71n5srdb)gX!fQeK4rBe4hN j>9ppkN~0=Fmf6mpcP?nZ&TR1wPQ_TM%8;cN=%Votx}b6$ literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83282ed43b619dc75655e22dcbfaf8c047b13cbd GIT binary patch literal 7479 zcmeHL&2G~`5Vl>%`A^%FKM9T;$RTw}FFhdCHbjK}q9k1Q61mw;TSy$sb`kBf@B+L8 z4}yH<u4pe zqPais`3GKO>*aMvka=+D9s*nc9_$#F-(&;2fe!19eiN1O5?Ulhyi7`D5ts1_>!l@p z4=q#e_^O5X46lQjqIa$npEqPQSsy>gzz+OP^m6|hD$_HtLY8SqmB|Xej~}qO@8O4S zq4LNT=^3wxPGMi`ot)~VZEH4pCQz;k5|<9aqzEv(3Bs6d1T#(lu5a$j!Si)fbmd9` z$@*_T`3G@ch}$lN%T6BaPS%(TZOn>tJrZ5ynyC7EyINa+UPI|R0IEeQij(gRG|TGR z+R=bG1&`=!J$qz2c?%HN7nOP^n%Nx?-KS+;8xkio(DdUo?byd<2;}-OZbdpBTu#qC z8IC`W+C4SBszw|DuT=-JMn*cg}n@3mEy&(YumMe!5)vVio|dEqSG;WHCp~gnt-wD4jzoyk*R&4?@_u+d|6j z$RwJ6P`U4S(A!F&u45~g3r>d9zGR9!PqbxceZlaFLDGF13j zGW6zZkBO=}u{Fa`SMAX!)gZ=(IygO2jdS~Cq_3}TsMe`Xs)pA4KtHBf%n}n@C05TG zt{Ue~=EZP?&j#e>6S}RnL?2f{lAp?gEJ$?tm&jKhXM(1BBItTUg1b+%HK#*9e#u!` zl0<&}R?@I1c;MH>9+Z164SRA+KSpnN&b=h(5>Nl9oS$w?Ud%yG?C!@9@Gi$3i76WM V54rF!F@|H{)sF7*Th2`G@dpD_j4%KI literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbe977db1acc73665596434e0ba42c7aa0b6308c GIT binary patch literal 2456 zcma)8%}*Og6rY*>U~LxTkdQ!BRYYnImI{v4s>&g%k{X&11%t3T)Kaxwb_TO%Kb+Zd z1(tJyD%buAaOfe|p8J=~u|4J1b1&(8vk*+GNL@2;-kY!Y<~Q$y-MP6cf$xt8dGK3} zkiSrv{%jB)Lo0p)!U?AdNokL!tj8$IEU{9%XB*y1oYd{PhPRWM)a!YMcaln4?Ntr$ zCbOyE^C@{s_zd?>3HOA3V)f>Dr9&FkcNEk#nD)12z87cxjtZ5~{$>~*#F;QsgX-Ix zqeR8u9V^i~2xUhoTrDKbEVOcdx$R;Tj4p5Nwq9(n$Ayyd-blrH_9P3F<039#@|Kxw z<(U#kYHGY@#)Hmgu(`Fq@iGF#u6@>pRBQtyNRM*TV{gbl<&?8iuV)$F;x_QMaJa+W zQ*uIkF7W2&z|Zgsubz^g$7i_@edP_YNv{e>%;{O9zr0z5uv~t~qjGG;*FY3ebV5$p z89OJGC`;KVAP0_ePYCog$}@dsLe8qVf|Cw;OWTcE?G&S-kg@`YXfFujELK4v9T265 zW0lCj85F5>QC{Rz7zQDNIEMW*I9HEK2tN#KM~XtIw^ZAONcN$x1VNO9MG*vV$viT9erV|9>cU#&fC z7O@hm!!SAw`=T&Axlm0piUz}>ag4R$vGl>l`_KyG@3cm%)Pvu+eEt&VwMz&-jrV78 z#C5zUWMGxZBd!vUZ`g7cI)kgMBR7xa29ldd7LnXWg0o*jD=^Rqm^HpJ_3mp1!T(r; z9?-hn#3{H7YmZ&nxB6ncJlm);T0W@KJ|YVb5@ca29^iHcgs}0_w8rU0|4XsU|imeKbA~ z=({%qBOD3At3^HYgz^!uLZQqZCaPX?tG?E}>R|dSi;NtZ#HTTHWXEr+U7ht3YJ= zsDBXfP=&f?&djs@n2RhDdZF`dYp2`V?FQXvI~yRpTyHpX0Z;P~2(VFV8bh#LWIj`X zJhUc29InTdY{15c(2B=E2(7ca$tyObarWM39(9e36!T4u*69LUqBw`twQ8(Jed^;{ zHm*+xB3|=a03zbpOf-BB47@Hmqu`zB<;-wQnP@m+SDDD9o>f?0VrHe`QNt>443{)j zFMxhu`xnXGNFQGm5BLFEfpvhG>x}PCn|mE+s4Y-WFwq17JYkULe3T&X2f?dRn3OXn zDVr3iJ@8B@Me2CUdk|cSiuK$@;fO?%K!Lh?1d~loBE=f^1+)S)sz?19-)6LGVe{^p zOx$kNv?H=nS{T19J$OFdyU2KDXh_V%dZB!M<6dd`zlW)cP~^Z7ri)-%7u~@y%G6O= k2wga`fQpF~v@8Kv_FiRU?@@`#w^&gMtWI@wgz{(o3lq*#zyJUM literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa887a93b4e0ac7cf781ec7402ea5bfe9553127f GIT binary patch literal 12068 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81c50a098214c2a19be8229c5c280cc803d001a8 GIT binary patch literal 1147 zcma)5&2AGh5VrR(+mM!06$BC|I7K2|Bslbd5Rg_JN(yS!%U-O_+HF?#{$M+ZM7^a_ zU!xrR4m<{@y>j9eI5FdG)vXW`UU_!xvFGQT&xfn4T>|6#^OF4t2>FSN_V8fw2BzKt z!3n35eKqc zXeLeeZf?YIny9fbpHw*!3M?DLl4r&7*d#`bl60CC0(Kwm9uD^ob~0^LHkp~MEZ!E0 zoa;=3am^apc*I5@cXmId5aQNwuU7gcD1yY4lh`>YN0d|UoQ1I~JnnMuj4WyFgKqN% zJvb*Gi81d^eaFUVvP`jv>w!83z^R{sFvQSPvUDz-Z-f%#8gB_}=9^$i;NLkV7a>|W z0mpQ|zf${pRtcq`1*8rc%Zkh}rqH4Cac?EHkT9JqY)O5ew{Tzy0xY8tu}ME;d^z zZe3UU7n}&`5bt8OoB~YF{vv>@gS`W_4tuJH!fICBgJs>rN&o;>B)RCrj&?v0XYsHd zw0-Em0@uM_sYFuzJ8&qI;&=vN3|c{NReF7(A7XzoKgQ}VV|mGE67?QqpJ$0|EEc;u z1T29SX0A5Ct=a@puU<7Y6;c92ZU9)rBZz_}(GyTKKJAe90*7{8huVGQ+TDC|1wqp* zg&@@%4Z}1(y1aRGmVfm+9&XdEVPF7WG|&<0XvwswwdGV@wE%(4+Qq{{V6> B6{r9J literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91c9d58624cb0221787cd5ff8767863320108685 GIT binary patch literal 27188 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 E0MS(yl>h($ literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32b6e0396cfc469bdd47d6ce839cb08fee021f51 GIT binary patch literal 19112 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5061ff0386ad43592f681c024940768db562c19d GIT binary patch literal 3028 zcmZuzTTdHD6rP#AuwE92Yq*wNdUYFc(v*ZYZCVNrK@A3B(n>2;E8`g(gIPPXCJEG$ zDg`P14S52oFT6xmANthC{)&C8`b4W@#x2+8F}IW3uERUsF7CK--sPU*aku*k$y0uYckfwl5AWfp ziRoSELDA>s2f@UZcc-Ruc$$q5WjrS=!A*cFsnQyG%=XyR?82Q6;YW^mWpf1%1(8?>|dRn zP6oxQn5blPo7sX0)J!g_$#q3zWXfb^NA|)wJjL_v1|T#}&6eNpKr8E$jng_s5`(F; zxX2g)2a3E1DQ6%vg+LTIl9oP#A>=tdpU`C=NU|Sc0O2gc2*P+1&Y?66@GX?U0w8Fg zZqnV}Hrv#p<{D9j<4|rIhP$gN!)j;}L|cYPY)mjY2$dW{S(Bqsxm|S!SXKnOPQ+iN zov|nYo2SruG`r+{qnT#US$d z@4=M%k;kb{^y3rm&=_}W4;bre4|u4j_mJ0L*sq6ndTC{`zJZ2}J7~zbg;;&ea!S4h zOP;jY0ZaU{A6flF)9Ow;vU<3Ug4VHZmZQHQZOZcRK!CG`e6ztene4?n11I__Z~WF*xGGW5mjeKG%1 zeFfIG!c(=rTD5gFt^r=GD_=J6od@e|6FYQF3_cqQ|k*ESQi7G~C7@JG2re;?c()0BQ2`x1>s7hDMZOfB< z=y@UdPcSoh1AvS=%w#sRsKso}Vcpcxx;2~H$BdfCOp8|)NzGC^%p#IQ z3(lgzDUq_SsZj}*F2LWbFA;l@!@|MEg|rt%*zE0@6>n}KvpSQWO@)1TmgW~`!NqT< zK3z$D;iYGQh~Cc^GI!hCR3ZxF1xP5lvY#(<;pc=(Okppsy|^@&y3<^?k*q9raRu9J zuBFltNGJJl@bbXa<7cnMz(oc!{YJ2altb>Jl`z7>IzcfmKeiV z1s*iKDr^t0hV2r{j_2Kjr$f{uU&X(A2jMjYe0Iv$5hf5YY~&=un*gp;Pk$ikJ9BKywsiQ#ts9KmBTzI()k`a#Fv7074@K9cL<&Pg_}g1S c!~_0QiwWutfF^|2htVP4M61-z>QE>5Kl=}^p#T5? literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b78e1c2762eaf2e37791ff163c91450ec0a18515 GIT binary patch literal 22140 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 KDt4^cG5-e~Xxn7~ literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0df2a6d8902bfa167d399c2f6f9769665c31d76f GIT binary patch literal 37613 zcmeI5%Ws_Lb;jpLYA8{%e5oD9cB-UlQUXpJt4wm`G!y6bi`s{-AW%c8rWX#2ju(f9qR!*>`ujT;3h z4IZA$bDs0Om+u?OHtaV}o;==4Uq5_ed+_(Kv|9g~gZ*E<6g-{2Cr>6*wbolNw5oR1 z`KVQOhV2i#>zx#Lt6qwG!%m93DPE`+Q@lvrtB$R;R{ASzD{Fg+p*3#TX0KCw=I(ZH zuTg&&DD4*ZuarB2=G?ZjHqIxqmrs1Qy2jg+w#khbGLBHgkrGlBf=4wJLQWhk%nf`w zw-=a&=q+Y_;Mf2>azL1C!3BZ~ZHC|kJ54IVR4IgM$OuL-o-^RfxpY8~VXT|Go4mVS z-%oq5@(I@m8SP8`1aS>KJ3MoG;Ra9$ z1_(KC%HcVyc)`E|p9Mpz4l?Aj(_xi1*GA|AWz|6?FnoYD-q?!aJiUOTdL|iXg#+;mLs1oM1eR z_gtk=h0qmQ#dEF@dZDL^jL@cnAX2cqMlT(?S|1SEpIgHo{oJZQRCs+r9;LU;TjB9~ z7swHMh0N)}tZA;s?3XnQfyDxzRY#JuUbQ2-T&DmmKpD43(b z?%GiT)6py|9Z=(kKd8?BJn8^ExaYn{LX}W8p^7+-xUj1f5b0cU;w<19x+xBF9buCp zb-m7YntMeK;|!VcpqDR5Q=||)OjE6&AQF~B4?@f#NpWg57r>g+@mnSyPz5e*yifQ9q!3u zFMMG+&afju7(~v3!)=2qOe4g&@(|KS6?&L8(whszfnd}ZX3#;d;j0fQAU(z4mGqO7 zz?G0A45~|e6b7MCg1`c}S;Xw)3`oc+*R_)ihF)_n#+)8A>;No1p~Az;=~bkIz)9M) z)dxfm8uS2>({q4R8nXDgF9Z)YA!l!?>Q!_1y}wpVIfYXd0#%sHa94?k(h}Gu$U<)J z{!vw~p(DwK1IoGjfWlF_Iy?1qV_? zA*zyqoRHvAMOE-@)1w#WoJ$AP__N>QL^?h!42bjG8FwM%1na@#G;|Tt>wPn4FVcK6 zC~ zF~hm^qR?s>4j70mwpmcU9=I?qge3?$XV9T>e_ga4vY4-K`RLl zMj*~>$o4&qSj!Bbi&gpjj_852g9SkO$HCg3PIsOd-t)c7+mTxWVDg9k_$MGhP$R0$a* zM9*y$=L~R)1VTp&emKz8dP1mir~G-0=-QmY=|M$+teL91$+o1@@v5z>aIQf7d2KNyZ7M;jq+ z4!2hsYIY`ydjwl0SLzM)_NvNW_0h&+ z18He%g+S%z!J?r`=x{=h)TNR$RJbg9;?RPDSqOZ04yq4GB#rdw1+9+4Qzk4@*=7f% zwh=<0OoxjLIYQ1sW?10USjD5@AaaD}=7tv39O!`rQgRByQ@AUaN|ubP4=5m2BOH(2 zSA%VKgah)>f`-5xLYV0&@d*Z^3^&i5o+7~+ekKn-RLQJJJxR&A7~29Qgjr;LKy*{r z^G)GUxLKX^@GwfJ0|Il|9r3hr2)y2n38I=dsuZE(oGceSi(E%7W)e zN%5#M90LKWf*`Tta< z!vbEIVMx_M&QQ2H&L)7ZQpl!0Adixh4Wr}%2gDmdl@QO#<|wcdbKo?gHw>~Wy}fEN zX9rawZYbaox^f8EGDiY71R}k?!4smVQow|Gj?B4(2PBg5VU&^_;1coBz!bnCM_cFs zhoNeyCkqhifiO}6ATC={+U&&xr=U^@GX+V>N##hvklF!6EqDkQ;*4f7^#Ms6JTy3} zX`KDxkWj+_z!=p4aXEI7!_X_vUZ^OL!$@x~KnMd)dc0ETZm9|u47rjtsMv0+Ar}e` za^((cmQ^1RC6MYO42G&&(GVbpfz&o3bEgGnad;RY76PdSJA?#JrJ+y?<)h7B1hKWD z%?=CdGpE;d)CW|8mvT_30S}xxxAv&H&;g$>N?8~#*!KgT8&wicH7F&NFVGu;vlox* zPiQ_1K{_BOGtXr!-L;bg!oFe1=}`?isl<^h8Kwn#L`q6^t_-SnhzrwzFb!kXUOlTW zP(kE8(vs)O!`cGaCiAm<4S@@ z=$<=BDsmx|Sr7Gug2}ll;eZTXC0ZEiT&ftSDcoJ7Y8#${JaDKSq+EM*u09}X9i?X# zkAennH4ri$2nDO;fap;TD+z6-odFVN5Mo@XIXc`UmEvKnx_Pu&4bqh167bM$4ua52 zP6!^R(R}cLpb&(IR;8Cl(I!NKkaL}SK3W4Kg!b^r#VkpM8E3L4V-3332Pd+=-oCwIw%8xyMT zRx^I~PxrvFoX|mtL56MW6M~06aPTR^0=c=y^}1-mGSq>=Q_-ui&Z z0*5hpR`2Yd?Jq-v;6R`daI#pygG!?o`CK9_gr!Z9xg^aMIXC1Su4ZLO9~Kkz*&&O9 z0*eY7NPR%kQlgO@J#2tE3eHm@o>KxTh0yCX=dB~Q1t_$fPux(j!=cb8RANV0?v>P zu!DlqBo#-MJ;0j_rdK|2gkk^W3t&d7Ahc0!Iu0ICX;e5Mx%FI=9#lZ)nnuX%ZAp0e zL57hs(;N5%>!B}%YG!*-fC+mEjv3CCFYGi0b9U%KFT{Or_Mko>dPL$mKpquBAw(}M zOdJpfm6qK|n!UdOYZT<5kfRU|NCG@&(582U(B(Ul94r`B={ds_QIH!UDV~Bdq&^@^ zG#ZvX1?#Ei@D6eImO5Ao5Lb*Rfo)QiAf*m_|Ia+6xw}VDl_B*30T25jg&tFau}v>P z3{eQ5BlXmeM_Y-M4k5mD95mPCL?k7I&!eI`H*^X1GL6u=A+!w$GsuA>R0dwg)dv&? z*y9wurg8R}5!%8Os+iDbs7J4S?miG@0C9Dt8TLwQ8#xykLJPqo#6VA*y$W{_U>B%T zJqZNkHIVv%$R5?uU1B@}fxU-=#Rbnbl{`o-96saotE$=ST9KE5< zFhdR=kUb8d2csIQC51r5IS;V9q}L0*fHAU209aBzA?BRnI`HNi=Q2nfR1U`ztY-%~ z&jyd2s`O|h%((i1BvXx^RlHK6lnZV40zPVoET|4EkyPBz)SJ633LMK^ND!XE^#RdH zUC*sBho=ET=;nnsb(Px4smm~s0&yCoUPL|H@WA;y9ynJ?6;efps*sWbXW-e3N3S^` zD8M*ZW;>{6Tzx>69Ayr;Lmj}{!I5*69#vNoaLx!F;HV0LMSTt@he#oz&8q9bn`X@r zJnun$KqB24Z;CmlcmqNkRfW(7#DX~rR`DEU0o7ImJyo71A1K#ZYNP5P>1_)hV0Qyj z4OLXprU%3vI1B}Fgg^xA<&pIPDapFsdeCCT(W`#Jc;G^g4s%kOo7*eIg((Os`S7T^ zK-%>}9uijz+kmuMR~3lP`= zPEy+r_da{a;e1wI7P+8QT(hF|1mXJt@TLH%XO#hjc$&j=R56h15n>uiv;U@(1;A{X zz057;95h!NYoqG+gyB@(EveiW2}0H0;JIi$A><74a;|>Gg_4UXc};ixN8Vwb4yEI8 z;~-cz4AzoORW#cWwQ&Y@qqMT1fmIGsKDtF znxg{(3*-nxmCzh*$_)g9^(3_o&rmI;wlIS*^xCH9Tykz0+Zjd*ra(uYQ6G@B)_J2? z(3334w16j-y>^(hE#yMMdm;`#2hjn}-qJ`3j_Nt1)Zw&J)m+eWIBBld2V|qiqUU&U z-T(%W0}Rd_o(7q2o+E)+#iNRW6vGU`;3z-}m}+2FfdxFZz+%;r%z%KLBhAr9sBk3AZ$A70|HLTV=)&zr$CDVVibOUo?GUMDL{o_LQJE7tQHD{b8{4= z56p&m7&p(VsuYAL7%$`?umdgN1UnL3h8#SgKpTdJDS*jg++=aVLs!Vr<`Kvuy(dCW z2z-H*5FBlW%ymVuU?|`@2v0B&jMGAnk?ONb&JfRO&M?<>96TV#(*wwEJs`@2wqe}& zza0WX0mF(7?NGWoXFwkyP*D&E#LzZ#(7O&Gh7iDvp-s(rfE5{LSd|nHD%# z=}yCw9uF$pgouL*L)E3as|pva2Ne(uEcQ|btZ)T|MGMxWw_&ayBgg-Qo(f9@R5e0M zIjXEAYy|}ex%=|DTQb8EHo%V0?lB{1k)<>UEuL3co4vuyZJ+gk+#bCG?T`8YEZeIW zSlsDQa0BoH0bwYR3ph79&>ta$YOX#B!pNXX+*~hr)CUxfmmYI2ha83+9+S-xN)S4H z2kAj2i=H#^STTIigA)=4QJ7l=>`oH`hLnPyRDsWeZ)x>Wbt44hNe@J@Va^>qAdz!D z)P(&7jB&Agp-Q1t4Fq9^8_Mb+P>Y_-0Rla}7**+of=6Yq^tO@nFz}!~3pHAPC*OD2w*4tHUy;HTb|ws%Kg)aUf$T*7!4=G3)`dJ;d{H! zj5fC3pIn*j<^A3J@AS1-CGX0=C3XC{YBLM2zp|edUP#}QZzNN-Zng$9o0KNMgY9B_ zH(TFd_@vcN^|jWm_Ug*w^!Q+Rdv{}NFdlAAPh>loY+T>j8crV^jE2K1RR@!6S9S)Q zZ*PnTqj#@QPY<>>CcCqEdt432(}h8`JsM6I#%U3|x7yR*WVm(tR%`qVNzRYnKL7Ui z_2K!^#`wx8fzMaN-y3di@0`zk*Jt+eO-hfChPxX(JLk{sZohYaXSnm^`K>E&p5J+Y z_wDV`x6VCzesX1Z`1sDo=CzHth7&rg;qLjXJDa23_s;FSKkW|&S4LNM2ZP_wd$F8M ztG(F#b>r-ueLh#W{g{1iv#;&9($A~y2WC5)bLk!=n{Gm~3wd8xdaJV!wBt#^^DB$v zlj-O5p4B&A9b9~VaN(It&%JQ*_1_+!O4;!}*__Vi-fZsACU4u!Jea-vlKC)wPcmIv zQRh@Qt*U$D(Ru6P7&g;wX}vvaLA{)==yIyc)X z>Q?QCT7TF%)B2?SJDm@DA1tKY!na$uk-hPy-0_9H32m0&edqMeUe&qQ9seLPrY)Iy zz1G#VG2c!%bdavz)%?A1tvCK&mApagoiy+2;_k8Bai(>%cc!(_I@8MdZtJ@#PME~Y zmM*N${(Y{z2mD$1(n^1}WqAjuOK%N#2VBP4X0qe=zWU5>4PJllmBFPKUw>}x#fz^z z%brh9UETTSg>?IFKX2)P9>^U1H{ahK4ko+f^`&&p2RWKd+gGLwvrFFR0oWRj!ud>l zm(yeN$BAKbHko|odP|G#e*25*yWc+E?sx8MpK33se5d_L`^F>ljxE#7zk>NXr+wnQ zuJzVhc!tIJtosr`3h`qk1k)ShNI2lUnVJ&eCJ!8<@SS}8(*8d zxI5Z5*^AtkzOtX+udFS9;8gAObaz&7b;iv-x`{$y)a5Ln-f=ek$yy?@5mO?Oy#?r{C`{_aE+e`^Ux^vzfl{`0Cz{CQl@% z{&4)bb-7)o_rgd0_3kh||5fj!)`#u%LAg*ZrVqZwk6XRg`mwZ?$ENqMz5LQz_~0wv zuRLgySG?QWO>f-~JKyi{IW~I(=eKTWb$w~=#h0GHG)R;yz3IZ_-JRih{EgJZj!aMT znUy}G*jg@8`mkCW3^vmT+GH@8?F{>ocku7>#C+&csSAv63meQUudb$a~rmGSN0WX8Xk5ho_Y^aiQ8C;Ofgu0(!z z{vmx&@^jY84@jrqK9_!;O>g*KcR9W5&$gF4Hy$mWR`cIapFw3U97P4DCM#60la8y8-FEk2F8v;Ml{a{Wol#>==6FKoUl!_X z^Ip1G?eX^t*JkFWb+?6$5m;MpUnPu zvMIdC|2gIFxBzF<$9g~gPPXp?e5tgH=b9U^nm+8p6`1>4ekzUor#v#BLBBoD@#@OL v_~G<(y14!3)#2tY@8#KBE|>SIZeH)x{&!~|Ay0iNA^246{l@7FryubtuEl+)FZMGIM$7h7c^+d+!B% z#qtNJd{VLZ?%2h4ZP-h!XYa7`3(tDb;hbb}!IH4p>nZ!$PdVq@e9MJ9He^ZMANev*VxL3g@Ka|Cxss&}ogfI`c;7b%sWVx~=X|XMSh6v!JuEv)lCxN9T9v z-5Occ+1-)h&f@c1OZGUbHLukg{HLf-g;5&@|Gq7G=(cVXsTzF;|C0RtIfKDJB{kdx zZom0pb)h#H6^siyf-?mh1seoi!5YDb1m_B_6s!_lE;vsxCHSylQgDgjY{6#11%fLC z(}Ir(W(ugj(BNe8P7|CiSSdJBaH^muSSPqt@KM2f!IpnSfglpPW1O-{=N4;MT_u%dv$rv;x8d{*!|!RG~E5PVVaCBc^k zUlDv&@HN5L1>X>SQ}8Xpw*|9;?+Cst_@3bVf*%NeDELtU>7KHFEVxBdf@OjS2_7g| zA~;xZq~Lyn!vx0(juspv&^ZUi??-E(n+}c_JX&yz;1t2{1Sbf5?0K^G73?n9U$BQ@ zzTjR0pJYhZeFS?777OknSST14>?PPuut=~#u%F=mf`bGH3Jwt5S8#8^K7z*z^hOMR zFLyloOq_-~VwMcqFwmmYv8%Zxs(p#7Gz9hZ(NpDlqw{SZb(wCPG5$KCbhY1cB z=!;7F29rLpq%SJz^Go{5l3u-}&ot=^P5PXZzQ%1oTKd$IKDDH;EFCA%Yn%HaE1yp< zbvjXSlHg>)O2H|DQw66LFt|q6>4Gx^X9~^|oGs8dlU4~<7ce+SaFXDB!IlEjdt_~r zb+JH{v_|ka!MTF-1gc0E2revO@OW7l32Z$<)~FKK3gix+sMsZfO9ht+#spUgE*Csm z@YDhZnt7m>gR2Fpfb?d;+Xe3syi@RQ!P^Ay61-P%gW!FF_X|ECXbaW~#swWgS8%0Z zonXCSLf}a^$eI*v6if-G1wFx40#7v~t1s}?G;Z1~@T2feb%XRI!3PCT5ey5i6Fg1u zbip$O&lEgM@NB_z1kV*bPw;%f3j{9|yh!k3!Ak@$6}(LFa=|MEuN1sW@M^(p1g{mm zPVjoc8w76@TrYT&V7}ljg0~iMRBP|zDHO)719_^s0dG`Ssu8)aXd~W@nHzX2M#J?} z#dRacXh|8dMpka18UmEr@>I4O0cEyu8>!SFTe-$s%_%$ptQsnw*}SlHaI1GSnF=hI z1-DwNI%_G9%j?)^-_nx=LgWjIrF0ndU!U5gcR`-WH`hijNzN--H= zK32_H@ETc2)h%mYVdb!II9SegSxC6KAtWpxvUZ&yYf&e1`H{4x(6OEzjnrFiWuDVNpRWl(}2TR=cI5HOfj4 z7M2dKTRLV7aLl5PVIjc2l-VLtJ$QB2jjAajOY@MZc3CiYM6zrS&)IM*D&XbrXCB}o zSsKff>J@TX1ajG2Y$qGJEUdaKuJt^+9J8eFK6g*^8|AjsPVT)WHrT8}aAU@L6I zs_u&$ESH6|+l7Y!JS_8A)rq-T716qSJK5Z2?CZV&iAGkqP_7533*EeL^Yz1-cJdlQ zrLJ3g9PdFktZJ8A1Ll!a@a?B87xZKaYaG_i* zP@21Uh-m2;UeGNK-rT_HaLE!2WkD*qF7qrTaBV>;o%zm`;7nLv!3%O-b_-ct*5U?O z)`L=N)#c5hz)rU0LYyvGrf>sW+!PlIqSV>~*xWH(s{n3 zf*THo>wzp4Mzd=HET*C&SWv>G%tB&UtX!jNJ@%;Pg{&KegW)<0g{e$&OJXQH#z0u5 zWY$ zna!CG0kXCNxH%`WWq`+gjs+JUSp-ZD6kPVD))v##Em*iLor{&~QHBLM#7MY@T>}Sm z!VuQCi(U{w8Br)$WGxlS9D{7jKwm5ps8B(cikw9)S%%D6Ii9=uLRj3-D!4(wZfL|F z&e{!>QWr9{L5~TrpxAQ4J%XNNWP@9p2;&Bxj}ssagv(S`3BdGNbaSkF=0FK5p&PDw zfy|_#B|S(W}+avuiT7b*<9*ss-GQT3p8fR&Xr1foIo!;pMDS3Nwc?67G?^ zpD7H4YbgY51$hR?qQc#9u^`hor|g(1WT_xwD>q**W+^8SV6;#{!sP1vp^Q8N!D6=> zYL z#k)%avaRY#!{B!kmqUatS;mRrvN;JXE<~-fP&imf;Gz=9x#q+m(>#~0o`oy}6 z@tmy&k7i03GUqZuE?cUSn*agIu*kY439M2I30uq@E@U_S=;tW^vsi9imhl*YLKdsW zxTw@1S5y2v0Dh%%Wi|SSJ*=FQ%Egekm3vi?hioZU2$r*y1(!t73vMXGb+_<$Ew#wI zA~zaRws5IM4@%C0XUpA!N_8Sf4g=wqS|MQt;ZM(!j* z)UGQaTLm6gXdWs;wuWl~#>Jx6F}tPR!hBRD$E%*Bu z#e!n1G?D9; zt3{xB1$tJg0nAKa{yGWSpjVv@WaM*+IgB-*YFC>383hOv;F?$3%{;(7YD>#V1bJ#n z5JTRv90f8K-4F<|MlQ`g0f0QsoyD~U&=*Q>EqK)yDp*VvYOBX+R2G!0T@Ds3%EI(v zmgZTMt1Xm+WtSKOg+!p_x`m1yr8-vnf>_yEdgLt5?kwGKvB=uW>6KDSXDO{9Q91#X zowUOG42fQ&=A6U=jcRGxyf*Z0E)bg6b^Uj3UGm+$Rth%=FNj^ggn`${4We~xOUs-f zi%ZNsO5Kpik;9O=ia-e}p~7x+pa**4dEi0`v*0p8P^K0uP)c1AIV-1^l^;03Ej^H6cOyW@{wIB|FiJL&qwD5FAx7#7*P#52<1 z>lPh)$k@sSx14zTwTsU>f6dYrE0!O>bouD+D>qH9Yfq&1)RKj>`;4z|r?LL@*mUZ2 z)7Zv#Z+4$v>W+6i-Kp_z;rG+THM0lyxAZ2)+mmCx>6wZC#MRxg)b3AA&+fOO+wF~Y zr`AnQ%&Z@q?DqTJG`puHXS)5dsrJV1?4rr`)VfXWb=_p7Hbh=k}C#QQO+H2!BTsrR5(y4C0 z-Rq4k>rY=Z((CqCj7(0f9qDc9ub-YeZrO^F;#l3Kz4rKqV*eRecDnr$U1Y7Effn7U vS(o*;%q}{iFgHzhA9F-8!^~j?4DUC5(C~Gw1w-?;|F?DF;_ddlp{@S~-IKl# literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8b561f27752e8cbe1b4cb4bde7c9b8e1b0eff10 GIT binary patch literal 29101 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 a_kJ@!-ZE?Yv{(OrrFHJB^0eub*8Ugw#jQyI literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d15d561031070d0f7f6830b5c6188babf6c204d2 GIT binary patch literal 23595 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fda37e2f9b9161d893fd0b553d801b4ba2fab464 GIT binary patch literal 22201 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 DLZ{0i literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65299c75e4d21e52127de2fb6f0545eb340a99e0 GIT binary patch literal 22224 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 PwRiW{tzPxuKM(u|Do+Dj literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72ef90b0fb586db2502942b2faf8aeeb3c1ffd7c GIT binary patch literal 3408 zcmeHJPj4GV6rY*>TZKJY&b{dhN`P zff(mPBJ~I#p*{A(C*Z`#*b|5Y$_L=m3%oa*)ZP%P=7fZp(LTR<@6F7c-}{r?DV2Nz z6YaHD!QG3Pzo#AuJQ!?!6z#s~bP9lj(pHr!Em<5R}m*lv8$_};PX*>+FQYl0WK zfl%W}ZUT`cq)_qf0clY|1>5yPOIX6*C7~@H;Rtt^?9k8!z92lq7erC`p!dX-2;jH) zfY>DTA@-#-xY^L1_+l3GCi;3XkjI@Ys49=v> z6*qN~L0>8rz_!%myc2gc=jk+$8j0pj$TQvqHc3morQ{}W_6D(*Ds_}hq<&0OJCRWf zev3RaZ>oLSU#v!* zwQ7G$ulM4278a{XN6Yzsqj|s4mWkOZq^?E=ioQwzh5nW*gZB-5J?1r`W$MBlzBq~4 z!ok~)gsz60&jZm27KE!!HJdfSY5SowB9BZ<2hiBEDHuS`T3P)_oq#=QaQ(AupYqz3 zRla=ZmYN2U!pc)8k<1`D^^}}GP_%(bFnbC38qncP&RYZT-(1B=8&|Q!1vTyr{g3M_ z^NWk`eK3D9yXS}-(*U7|i1E15l@aVt&_lw8bGd6Lt)A=lbpLHf-RVV*xIKWt^(XGj z2j#$`X}m#?U|{v(XI^>_7|2>OqL1h{9nq`gi%+&0b{vSDc(LS>yMAhAcb zp!bSt+ib)H1IycJ3A{UNWPo*Hx&7_zk2iiD?q0?cFeCf3g4w+@>!p|$4 z-o0EonU?meH|vY01*MLR2i+tCZw@wx)}5=@6=q9lU8&cQ)PdAKN3w!TX)%(UG`Aw`|Mhl5Z~SVle2Sn)BI^u0mXm{G9qy$gjA%0fF!h$sDomMhm+9i;@voxp6{H! zHEJyPg#`79?-29WcOH4-W9%zW{R*g3m{}(wp^3zvcf7N+J2N{wzuB!yrA(mxaX;r< z6+-?(=3;Y!`3ib*ABZ4=rldzBN^#6m)^j4K=SD6ikBD%DdqjjQ>7f&O!fTPb|BAx4 zIyIG*-B`7x{$AzVQq`FWag=1;mX5VF;gh(tn`F{*9oTZIp%2)KAAm>_Q9&XmXyk|+ zFUStHc1w|K$DZ(yg211rGv?Nl zL8_B)4z#@F>#$a?LAzRLMa>Sg?o9}eozq@?0s~Dn9g#z}$3|4pUv20{ggb%&bp;cw z%V6XQ0&X}>2-b8OXI;LNq*|(1sI~4JuNd^DQXX(7;5^9^&AC|+NugD;J@i>dq zgP~NW)X4?JmKQx!=4o7L-huE#)ZId+JIV(oFR3YU-T`63`AhQmeq%T9$wn5dBok6K zg#1aSdB1@hdlS0Uv7)6+>bT!;EbIJPqc8gp8fmiK=pX3aJo|L{L8C~tTu&dK?IkE-vg3u=STKl+y_vZkcJ$CGj=!o4RWBS|~IojRxo-)-0iGMsL z0C;-=^wNlpp+@QQ-ZVfhq-6ik{m`zi!0H{Cul{HL2F!<6|IC;?cSitInE4GL47OnY zrf?qO|LpM`awB&P4ua0f40t4*MS}D;`2}~J$*FKp_cObH9&9gw=GS)TtuevT@$E6{ zUVQ4R*Jr)~KMw`MYYyMLSJdD)0a9%@(KRRxxvIswwhh$_WHyZzrqQbtX!SeBQ*as5 zIH}BRE}L>DpJ`rT^;KA3jkmVBxv^>dH1Bqygm^-354!3$h}0qygqiW18*Tn%&G?g@ z#$Ru@kPp7y*lMow^|tX^?XNf6X09ut=nRyCG_}PC4I?Zph>W`!LTBJB(}240DzFom1s1&%it|-E%N8j+ z@trCQVP$y2SipvFT>~jR8WIjbCGvAx3$^UGZR3b!ONo$F607+ z&H7?0r*B9{rYUUuH@vnq+Ny{sejk0t@(8hYt9}?TT6VAp@7OZigcq)I>48ufC*#R% f&?{{2*(|k-FIYLhNfSJr9O=uuXbLkrq%+Px_y;EG literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75094c0b18446bbdf20a2509a10689b676f99382 GIT binary patch literal 1136 zcmZ8f&2AGh5VrRxKf4=B!;d&|4^q3(f|N=Kp$4cZBC1F$Bwwt}u9I%-&2H@tP?Q5w zD)q!Wz_IVZldQOL;tdcd#@;1OYimZ|jBR=5`{tn4auBQ^4^#THj?ga^EH4X!=V0;+ zxCljhy{*Svi_qDQ$4?fKy1W0r3`3~r z%2I@>CGUe{h~NkjBeKrX2uDU_o;8Vijx0nhXvZ#A-fs5>OHK4cL%%Ma!VNGJOuhh@ zqa4rB+&D63IKp2+hTNQ^+yb+~YG8G+23Ql!nWJ%IhNwG3-@NZg5e&Z?eW1$a!DLKF zG0%ayR$hhJ>wLO*t46BvetNshpagqMm65WMK;?S>7=U zOENwZ9voiaqDg7U11TxJKz~pC!!%+3BoOf=V#1Hu2gcLP4?)nR^lPC$TAQ#u$TELD zPe1t?%ep>~hkkaNAEuMd^{y}DoULU+cpQwG)Gs5J`^hkrV>K0JP3zgIxB+E60F!sY zA>1}Bd}aTsIiK%c6Jq^82_4)Aoq&@`kT6OMhtedCrd(l<(vxYx%M<-g(W-h48Rx*@ zZTPTsZH4YAr%3LANi8qdaldn`Xe$bUzNPAgx`)9|S3 zSZhVR@lefobxA3wFCB|2qhus*n8B1+8Ko(4hA`+=Lg}j?gBu!!`ma$c7|3QRZVz(G0AZ_Ar z(C^SM(C^R>k-z!3QYF4Yn?BT?+1tClg(Ey1hc@REd$T+9o0*-R9hUR$#^bR7|NG_E zVfM#-An+@6)W0{p^CkaOi_t)U257JtI0%wpFhD~j#Dd=r@s9x?3Y6E!li+zT4B_|itZyY81)U+R$l%0ArX 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 L%7ivl_=@>|C>7hr literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c76e23fca8afce7426730323a72bd209c6cf4e5 GIT binary patch literal 1634 zcmaJ>OK;mo5Z)yz>P1?VEIUpgK(9h-D-X!=p(qL)s2j8i3dlu)y$}?+ky!6i%#upt zLOCfw{zMNp&`bV9e+jQW_11GQ?aZ$1S}D*a_;Fs#-I@7zfAIYlf$`h@d06>`{Eo`) z;ehfLyu~j72}!6Rk}^tBwuB{ZW^36Nj;yhobeSvbtS%d@A)BlzTdbx1j%Z7ddD3UT z)@x!*c34LSEYP|uy0XW5TCR(2*=Kz%H^h$IWxHB#iaT1d;N(K3 zLZtE2dBR22`gWckDI;%x7nNx?+6)MuM)9Vl{bVAK4iC*7t&B!m8CX@IfARQKaei(B zx@Or&|C%7IZ&o^9h-swKC^Mlu>m6>IA*;^Wlkwrh`)9K#H48!dCU*1ViFb8UHSDo?k$@o^q zV{FFtKoSAD2>!766`&*~U6Pe`X;|nACmnX-r^8| z&@IcQ|9NU)`P1#W)S(u!{&pY+(W5Q+y7td|AMowqx-)|sb}5S_55uYzVm%iEWiJe0 zKsAg<@1gS7g^0Nj(9@4$HwNyagsj(XzXw8L0W_%ApA9~$dRQN5$*t5BhOiDKY+NQ` z%@o!ZQ8ta&_ls`v|C5Jp;e;t(7AE?JOst2V$@TqUyf*}6K6*>I4vYi&#yV&-)G$`f zHqThryF?bUKuYQ&CN0$kUQ#HPTD5&n2pMqB43Gt{$KeGcGK&SL${{voF Bu*v`c literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9217dc708950ff1fa775c1a411064f67fb075029 GIT binary patch literal 2492 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0cec844e189eb59b20141dab73f98a3470ddbb2 GIT binary patch literal 1997 zcma)7%}ygn5bmBokImQ+Smj5Ga@a^4Ia+X{C<-e@Asg@l64)zyxQrCF%yb)UX2zyx z94(ePfwZ?hDmXHmSNd6t1gMRo*=A$hOFy%fX?LRYQ5G^^&7@*2#qO_B-KmFA>^;?aP}3 zK3kkF;Ux$DvvtQS8gVVr#NxGC9+`M!HOY0W5LAQm& z9bUL37c?k3OLURTu&QSSJ~-kD5NaFQROn$OL`e&(gssH zI9CicG%Sr(nI)r`#fK~ea8qSVk&5g!RaPpZF8mf53!_e&GWMGM9o3Epv8W{-*-N;P zH7_m?Z44`2q*8OHz9p9$B`q3 zmPXBJ+@O!DEzy?-PI{BQnoJZ*p=#`uFdfAf3(ms>T>=3O4$sFNIx z;C;TH^EQwEY(3PGU^MVyPB?UeKZ7!%Tja;?xdFJ7D>^Z*>A5*EGox>w81ivu^=+(S zN=~CwOV1ZzehcQ^x8{p5Z|Pe~*8tmzjh03F3*7jI7=$grdD8dbWEpn8g084sLx1!a zPb~Rrb|3Blz|F=D1}!zSEa_KPr9`~QSc+UCF#~1STdihGVizi>(e&AVT{-y%R8_@6ss!)e*$OHPe2gr zQV$x(h1QwL3SBZhXeZYgFU}PYp1W5xh!7^PpK=WpPS2rb`atFYT%5L zsCOdrR=8~d`4HCjV5Is#h+2@&5~lFcTnhK`ta?a(*e{H!5@Ydzk0R7P#!g3_C|{9P zxKwkEZfE5J0ReetXYv6qypQ5D6c_-|Wlo2oh$5iWJM1+xXi`Ad{S-!umP;+eb3EIi zB@>6cqRFLEEvfRfTXVvbh_fWp$fskQX~otT_QKWHWrC(*-mNuH83)>@+DdM z14bs?w3RsNp7nHh^1F9W?RFga`0A1$t*Ey4Q8=P|{ z$?QN!i-L)qq^jt|n`WQ%$VC;BaVM%;Ny1f{B-Lq>?1g#Kv|hQZTFIuy+q_8YDM86d4P;V literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/big5freq.py b/.tox/pep8/lib/python3.8/site-packages/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/big5prober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/chardistribution.py b/.tox/pep8/lib/python3.8/site-packages/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/charsetgroupprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/charsetprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/cli/__init__.py b/.tox/pep8/lib/python3.8/site-packages/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/cli/chardetect.py b/.tox/pep8/lib/python3.8/site-packages/chardet/cli/chardetect.py new file mode 100644 index 0000000..f0a4cc5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/codingstatemachine.py b/.tox/pep8/lib/python3.8/site-packages/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/compat.py b/.tox/pep8/lib/python3.8/site-packages/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/cp949prober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/enums.py b/.tox/pep8/lib/python3.8/site-packages/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/escprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/escsm.py b/.tox/pep8/lib/python3.8/site-packages/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/eucjpprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/euckrfreq.py b/.tox/pep8/lib/python3.8/site-packages/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/euckrprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/euctwfreq.py b/.tox/pep8/lib/python3.8/site-packages/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/euctwprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312freq.py b/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312prober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/hebrewprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/jisfreq.py b/.tox/pep8/lib/python3.8/site-packages/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/jpcntx.py b/.tox/pep8/lib/python3.8/site-packages/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langbulgarianmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langcyrillicmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langgreekmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langhebrewmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langhungarianmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langthaimodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/langturkishmodel.py b/.tox/pep8/lib/python3.8/site-packages/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/latin1prober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/mbcharsetprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/mbcsgroupprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/mbcssm.py b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/sbcharsetprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/sbcsgroupprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/sjisprober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/universaldetector.py b/.tox/pep8/lib/python3.8/site-packages/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/utf8prober.py b/.tox/pep8/lib/python3.8/site-packages/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/.tox/pep8/lib/python3.8/site-packages/chardet/version.py b/.tox/pep8/lib/python3.8/site-packages/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA new file mode 100644 index 0000000..c455cb5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA @@ -0,0 +1,411 @@ +Metadata-Version: 2.1 +Name: colorama +Version: 0.4.3 +Summary: Cross-platform colored terminal text. +Home-page: https://github.com/tartley/colorama +Author: Jonathan Hartley +Author-email: tartley@tartley.com +Maintainer: Arnon Yaari +License: BSD +Keywords: color colour terminal text ansi windows crossplatform xplatform +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Terminals +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tartley/colorama.svg?branch=master + :target: https://travis-ci.org/tartley/colorama + :alt: Build Status + +Download and docs: + https://pypi.org/project/colorama/ +Source code & Development: + https://github.com/tartley/colorama +Colorama for Enterprise: + https://github.com/tartley/colorama/blob/master/ENTERPRISE.md + +Description +=========== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +Colorama also provides some shortcuts to help generate ANSI sequences +but works fine in conjunction with any other ANSI sequence generation library, +such as the venerable Termcolor (https://pypi.org/project/termcolor/) +or the fabulous Blessings (https://pypi.org/project/blessings/). + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.init()``. + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screengrabs show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + + +License +======= + +Copyright Jonathan Hartley & Arnon Yaari, 2013. BSD 3-Clause license; see LICENSE file. + + +Dependencies +============ + +None, other than Python. Tested on Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +Usage +===== + +Initialisation +-------------- + +Applications should initialise Colorama using: + +.. code-block:: python + + from colorama import init + init() + +On Windows, calling ``init()`` will filter ANSI escape sequences out of any +text sent to ``stdout`` or ``stderr``, and replace them with equivalent Win32 +calls. + +On other platforms, calling ``init()`` has no effect (unless you request other +optional functionality; see "Init Keyword Args", below). By design, this permits +applications to call ``init()`` unconditionally on all platforms, after which +ANSI output should just work. + +To stop using colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper to calling ``init()`` again (but does the same thing). + + +Colored Output +-------------- + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences: + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[39m') # and reset to default color + +...or, Colorama can be used happily in conjunction with existing ANSI libraries +such as Termcolor: + +.. code-block:: python + + from colorama import init + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + init() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + + +Cursor Positioning +------------------ + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + + +Init Keyword Args +----------------- + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ansi codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + + +Installation +======================= +colorama is currently installable from PyPI: + + pip install colorama + +colorama also can be installed by the conda package manager: + + conda install -c anaconda colorama + + +Status & Known Problems +======================= + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some presumably valid ANSI sequences aren't recognised (see details below), +but to my knowledge nobody has yet complained about this. Puzzling. + +See outstanding issues and wishlist: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + + +Recognised ANSI Sequences +========================= + +ANSI sequences generally take the form: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + + +Development +=========== + +Help and fixes welcome! + +Running tests requires: + +- Michael Foord's ``mock`` module to be installed. +- Tests are written using 2010-era updates to ``unittest`` + +To run tests:: + + python -m unittest discover -p *_test.py + +This, like a few other handy commands, is captured in a ``Makefile``. + +If you use nose to run the tests, you must pass the ``-s`` flag; otherwise, +``nosetests`` applies its own proxy to ``stdout``, which confuses the unit +tests. + + +Professional support +==================== + +.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png + :alt: Tidelift + :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for colorama is available as part of the + `Tidelift Subscription`_. + Tidelift gives software development teams a single source for purchasing + and maintaining their software, with professional grade assurances from + the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + + +Thanks +====== +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. + + diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD new file mode 100644 index 0000000..99011ee --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD @@ -0,0 +1,22 @@ +colorama/__init__.py,sha256=DqjXH9URVP3IJwmMt7peYw50ns1RNAymIB9-XdPEFV8,239 +colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +colorama-0.4.3.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +colorama-0.4.3.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +colorama-0.4.3.dist-info/METADATA,sha256=-ovqULHfBHs9pV2e_Ua8-w2VSVLno-6x36SXSTsWvSc,14432 +colorama-0.4.3.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +colorama-0.4.3.dist-info/top_level.txt,sha256=_Kx6-Cni2BT1PEATPhrSRxo0d7kSgfBbHf5o7IF1ABw,9 +colorama-0.4.3.dist-info/RECORD,, +colorama-0.4.3.virtualenv,, +colorama/__init__.cpython-38.pyc,, +colorama/win32.cpython-38.pyc,, +colorama/initialise.cpython-38.pyc,, +colorama/winterm.cpython-38.pyc,, +colorama/ansi.cpython-38.pyc,, +colorama-0.4.3.dist-info/__pycache__,, +colorama-0.4.3.dist-info/INSTALLER,, +colorama/__pycache__,, +colorama/ansitowin32.cpython-38.pyc,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt new file mode 100644 index 0000000..3fcfb51 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +colorama diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.virtualenv b/.tox/pep8/lib/python3.8/site-packages/colorama-0.4.3.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__init__.py b/.tox/pep8/lib/python3.8/site-packages/colorama/__init__.py new file mode 100644 index 0000000..34c263c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.3' diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94fbf2884e120311496f6df33ff73cd250d3985b GIT binary patch literal 449 zcmYk2yH3L}6o!-3NzJ_4x=jMk!9evptX&h6G_I%ev z+nsUTqifczeY))TlKbpt<2vK2*cVs26A$J|==teeI;+p>`F&NAF^m*UijF%_;06E$ zNCP}#;h4)H9s+W}D1a1D>CGz)bnrF4pmfV!Cyb`_J#raI==*Ptd%z1CclrfCMADf$7;Qu{S=)ASO}(LBsD3mPrZ z;%ki-nYC}YS)fa_40Ku1HqaBa0(6CCfu95V0-XeUQqg&!FVZQXrxaaaxqZzovOHjk z6#&c32ArVNU9EO`_jh}BGl;5NA>Hn?>INGy?h6)G8=dZAwYTYWzb6>4_Cg9TMOYp3 zU?76Q2E6HqT)hJRRxt4UQQht`cC)%E#PFu$utEJr@H7}Q8u;~)Z#YOfDA!|A&mS@m zh1$FNl?N~$z9pF+0iTU7oEtEjFrqSm&;;4j_Q^E3bXtSW>m5n94s>ZWyNl9@1g{Zk zqRa!0XW)ak8_s69#hif;d!~##ls#wtaOj{}TM5qe6l-R{gg+cQbrHUFhHQAl=?9OT z;f~l02iNO2oG1`%X6W~x`Wq~Alep`7z^j&v4a9;1#^ zivQi8KXF`h0FH!=IHfP&>ocEwQI9h=sEnz^`Fm))tF&>9?n%?^L{&c+u#01gCQ%WL zV;9;w3nM}<)1clos5huOs4;^YkSeCkHXv3_uqisWPqa1-qluq?43cdGq!mY@)+yAhmjmzI7f9V zG)E19oM-@zBw=-a1(r%O7&A?kh`zS`1#k{)W4G{5V|{J;J@m~bDT^{ssxs%7);nL0 zDJzXBL*9F+Yo4zz^W)OWdShk2Hl{Jj3+2%IA^Sa)&Y!Q;oNF}iem$mf+(zW}Fl3_( z=SLy@5D3-7p>mQQ4*fg{r>+{G(RoX5NpeSNuNj9CeJRP#NlzQgOWhd|H;QU;%+bK= z)Cm6!*k?a<#Y+}g{9{GsyB5v3S!%g9&AK^iyLp;(3pDQ*X~8Yg zqFbgV_<@(*3Y~B-&4h_^IWTJtisu+nOEWcq%q-CkOk=3INNB{TOL3$4y- zLz>O|jgCyM-&tI3$<#`#+gg={_Ts{wRVBh}{Va2e1W`yNJS7szqT(f@kt-scMeV<@l{YCV~WOKAz+@y z-ymSJ#&rY-0Zoc20z-I=uz|3N5Fk83cnZ+rEx!3CoKB@e~3Kty9aKOvLou3g(hD<`?hDbZ2ShUZX9uD$Tq`yM3lrXg=n; z`mK&)&hafa4^%mNRAk2UXxQ^Sj%Rz0wa#-0Sp+<6aXkKTJbcJ>_~;4i3H9?-eL!Uk zN2e(1(!>&l0)a@%l(JH$o2p@-wNGjNko?AP>mVVj0+=b4j)n!dZP;cxS1y#N;7+Fr G-v0p5gLYB? literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..475f55fb1e814a4783440fcf418dc26981c119a0 GIT binary patch literal 7743 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8315ef8663654610182d5a9885e32fbeb18e8ff2 GIT binary patch literal 1710 zcma)6&2Ah;5bo~z+1c42{{#Y90aiXBjf6c23lt%OKnNc=>?KQrR*_cCcC$P7?98aT zH;%*Rf_>lu&tM<(4m`lVYANm|UWPlQ)G*BYt%ccrcc+Q5g+E$Tj zp7UW##j1rXZOxB5s;xTb?2He)s;f3|bwh2cEqre({*WbiUg6EG|B9ndc-{K0FxjAd zoD~P3AC75jeF!wZM=|fCvKZ)b6W+1R@-u!RE*XZ$9&l%=4EF5R9ezca~1enNAA{S)nwfNjosE>p{=Z{bl;ZG(n?qN z(>(hntxoN6&xLcDkz#Srw2N8GIp z#?GWA95g3C_p5*4WZ{_|%NA_G7h>X_aoDk3;ZOh0tvK?ek2;Vc%@L9azEn&$in}(l zK7E1Td1ryotQdK+LB7uG33@f1SNMikAe%Ne=eBjxww+6kunHLyw29Y${^<$G>cOGR zjqZ)h;@3PIThlwq?6fC~(_U$(8hR2Y4+b#TgQQz~xLn7NWIoqF0F+RB=G4^TGAj_^ z?>R#Q+~kXlE?rb17gS9+``OjfG9uyr%^jGC+Q;N#{*F)R zy%v&-rn92`2=igTqMKY$2$kTmfDduyR#0fO>$2{l@qa$n1$7G~ z%IlaoxEjQi>)QJSjfD@ptJ+(5ivQ`q2o}Kwzhtnx2#&-HtV^s6K~3i_`UCL=-bHoQ zg@!FNE$6u!5yOb;MBpTZkIC=$7eIZjZY+rpZ(s|XxcMWBq5i?RkB>m?#OqK{%H4kA zANKo$WDD+~OC2N0DG%7E98`5nVtcja3AI<(B9~lq40C`w80mahGBNx7S5Pdx>)jZeVP<~wnMaauYv^@-6IPsz&z85vHexj)HA1xeX4*&oF literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..920dc28207ff18f1c45fefc14a703a41b7fa22ce GIT binary patch literal 3986 zcmai1OLH5!5e6_14ylJJ*_LHlD^vE`F%z3~)|JXu%5hmw+f`i2CCbt6R8mu;0Vt6g z&d?apdK7(G202*I68qk}uu>yhb zua9GI_BtVd$HwrNhsJX#$=@g;oVbKjmmXC(<3`9_2DKTow&5C-2t%-zc}!gkdM)U+ zU7M0E5>-qha>8k_y@KSF;Ex-iW%Jwz;^w)d>%w>B&opwsB``VwF4&=J*Xh4LuL|O+Ewl9e#_?LS5!Yos{RA|2jQAZT=I;kLc&MGEK*7 z&28z+!&>ZfA)&+BZ$|2{Ba#4B&OQhL@Ejp8pd=;`PU_?by7mK*lzP&FE=~TuTiuP@ zq8jO2ko_BQvQjl<&qfI=ij?Ekl0;s!F4?E$BE z;G9iz1sOaYWiz$552a|N`MQ$bKy{@^?ZCtBq`BAYuhuqKHZCj)g9uLh97^&Gh#)TI z1kMX}4bFtwfb*lN2~lc8%Yr%wwT-CDplT7A8?;?lIq8F){@)RAy^OcOKm15C7+1xjZ6^uxd)bOX;_A0$4eT9vQ2%D3R`WJimNs3-Ycxg36HlUPL$;sCDaI(IZIU1|4mBAVOC9*xAI+RZ=>-?! zLKyhkg|omYa!lS+1uj&qM~~?-d(V{7W5={k^bskWdY1H-_d=+pI7;GB)B`C*wAgJl zgnSh>VmSgcrRH`Vhh-zRcm0TmA~l0#yP4*aZV-qh8M0m@Kk7lK`kkf+L8yKY;}Z-m z0@gFih<$1@c^}#Vb`F2Ib!|PmOhE{8_JJs>z+#}rF>SDA0{Z~_%f{M;%`+H*03=wZ zfb_^8#$odWH~u?FZEqQ7v~1f{FJERUt2|EW?x*JGpYDiA9CYL}v`}Y5lQ42LH?*tD z(=ZPFFnLxPC_^SO{OB+pLp1A(zs#Vr>zm8#Z#Gk`S2i|=78`gPPVG5f+qfp?7XqFh zKa~~WE^HNjJn(Y~8n8(~1w9S^X6Wn8%iwSD_SvRQ`3un14wv)Dp<}`3JRB0?x4kBp zcd`3RB=?YL`_7G=xjaZ3pq^lsMw^Gc{1|!ybj{g^F2b?|CBXyUx1B+hVvG)~W!l zf|JyvEz0R0O=f|EY`;fk34;pdAYs#3!>ehUWXMad3il4&I9<@Dwd zZWnKevYi3vbk42}+vlxrqSA@17Tg<%SR#KC+Uav>FV6lJ7EdrK1GelMHO(nVTLoIA zMFv>^2KobyJZiv~>lYmki_qwYg9+h4PuTZaSQ{s1k9|)ud7YS?0%s|!XZA2;3}yE$ zND0<^s9QOG-)Pv%P8RQDFl%ZHxH;jmf^JT&WlYBDthd?>!+zFV@2XB$Ey11d2TI6= zEbCeC{IDy^xePH=KMCwmL_2CXwG!n^rO`=8qHf#UmrbQa^wUS@@}-W!qy!y@(Kt#A zw7@V)WQ8KQOMmp(IYaLOK( zcKZN5EMdm4481NMmf-ObNBEKeVH``IT^$cg_X7kn*~$PZl{0_XnLp44vV`O*5V(3S zUp>oEXXxWWm(OwF0+PEx+&p&b$BxA4`7C2yKKCC%UEdP~0uw<01a`R!@(WoPPa$S9 z^hScWTn74CcBSdW(2?70s!(jf!^Bd^eQMX0^W&p6|AKSsG)d(v;LCKg{PXN^KY}Ja zNA-hUqKa$73vRhqOKrF_co=3eJw9;Rij=WTM_#o%u~fRDQ=Gm=G@ugiVu{B>V#aoD zFMFrx{DO~))Y%g<65*4t+|l8iEb||F&2@aaqfK({mkVplwG}rf;i`xKDzdyZk4om^ z`g%?N64=b&7^(7CD7p2SUxrTJZ&3~5m&>SI`~<5liT|Rwx!UWct@`GMzR4vzMI$$a z^!df*Jk6eJ&oK2Q2S7~7O00k0igc2iz!%vxvsrP{VdklAI1FlP|Hn2n&Kz*;oP%*N Z%SSuc*SXlvX0aV}H0PLwNvGfx{tG?-e_{Xt literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80081dba9c056b26460c5c134d141bc34dc9ff9a GIT binary patch literal 4670 zcmcgwTXWmS6~^L55TqnZRwBi59K}hTFs;QjZW}jE6J0FHZe%K>%cSPCgQ2*PMH(X5 z1sK~JsMDGHHR)fF-s=8_{(?T_2kdK}^cV8f?<@dPq~$!8nmv2=2As=x&RJ-0V#3w% z`_IRrck>NR`;i70edrX&oyrN`ag_@fw9Rgj4d@bF}8UD zG%Rj5Y;H9Q z+-^9$&?s`J;qoG$>`LdGc6T)lLUE3>nxIFW>qHD9q{q2M#3oVzsaH$V@w{&H$oD+y zdfrjU`vLJ~&--h?8DuNg%I5OwSJGVB+*^~@#`fA;U7D*8m+R8lUb`y`50*F9>buL* zez>-|x%G`SvE|_lO}vhGDDqRMb{HP{wQf_iyWAHw?tkkCVXxLYY>K0l-fF3(TU|eH z_IkC&IDA^``Mo=}puJz~J&O;+?(M}pwWuBYw|dRi{x186Zus$P*p0%#-)RZo@2>O@4t#OHdk{){XZP;b-fpAxWI2vSd%qw15unfggJwU7 zWij$&uZfjNTHZk@d^wS?r9;cx2jniys-f*g1O_=d*qn}SFK9nHj9)NmMt*Q`!O`Sn z3b}T-9eW-*J0i$vtisC7p+D=mlG$!C-}Y)FUc*rsh8p8+R+}SEM>AHyD-)el6jV*| zE;{i(kq?MeiF`z45Trs0SA3M4;ytWJWLb?JPv1{Y?yDbM3JsCLy(vPw-SYhK!SXN8xAa zonO(qnL5T)0c5EVPzT2}6~Dn|IuK2QXaK#V1m2&(VHXJ$giooRV-bmKappa|!rVjJQ^ z98Tj}$!TN}qO#GYGTy;~4YY_#SmpwDJdqn;9UKvlFh*?^E&3QF!&rr44{>pzVLIXZ)spcg7V zq{GRqWy=-kv6IrGV zn=kHRYv!V|F-f^#Hdp83wpV+K^vOJ>Y9^{JQ(n48br)XJPK}FR62HR%SY0Wz0A73s zBIk$x8PzOz(3iAT1p{d}uG1Bj4V6g-s{IA~a&H;rDdnvvVLl%V;VG1a*yZ17b{287s;L=Vj4v>=J4m)mUzW&=KJMb**7)6bpSTCU_n^PAu zYaAhB9ST&-<8e$mS`Z2ZRlpP(_lQ&QxKG?4iBPS|0$hAW6T|#Qmn=c`M%0On79;7V z<_+3i|DRZn7C;6*QvR6%t>AL1sPfP8OdjXM!y{#iGBTAa72lI!U^P{y(&UvUZe8ix zm>Q<*-F6)K`Q_7!X*4db`uI^R|H5Nmy75ycR;yK1aHPofl;}v7d1GKzMjH0hW8cGq zDp49YH;B7Ugf4=Du1kXMBdUm}S(XyISR=AUmW3W=sUsDow8#% zmTS2s{MoMKIIinD?t=S<+KEqfnO;Gp9qxDhR;>OdpgywIhRfa|ozK&MjeJ3FP> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA new file mode 100644 index 0000000..f4d89c4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: contextlib2 +Version: 0.6.0 +Summary: Backports and enhancements for the contextlib module +Home-page: http://contextlib2.readthedocs.org +Author: Nick Coghlan +Author-email: ncoghlan@gmail.com +License: PSF License +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +.. image:: https://jazzband.co/static/img/badge.svg + :target: https://jazzband.co/ + :alt: Jazzband + +.. image:: https://readthedocs.org/projects/contextlib2/badge/?version=latest + :target: https://contextlib2.readthedocs.org/ + :alt: Latest Docs + +.. image:: https://img.shields.io/travis/jazzband/contextlib2/master.svg + :target: http://travis-ci.org/jazzband/contextlib2 + +.. image:: https://coveralls.io/repos/github/jazzband/contextlib2/badge.svg?branch=master + :target: https://coveralls.io/github/jazzband/contextlib2?branch=master + +.. image:: https://landscape.io/github/jazzband/contextlib2/master/landscape.svg + :target: https://landscape.io/github/jazzband/contextlib2/ + +contextlib2 is a backport of the `standard library's contextlib +module `_ to +earlier Python versions. + +It also serves as a real world proving ground for possible future +enhancements to the standard library version. + +Development +----------- + +contextlib2 has no runtime dependencies, but requires ``unittest2`` for testing +on Python 2.x, as well as ``setuptools`` and ``wheel`` to generate universal +wheel archives. + +Local testing is just a matter of running ``python test_contextlib2.py``. + +You can test against multiple versions of Python with +`tox `_:: + + pip install tox + tox + +Versions currently tested in both tox and Travis CI are: + +* CPython 2.7 +* CPython 3.4 +* CPython 3.5 +* CPython 3.6 +* CPython 3.7 +* PyPy +* PyPy3 + + diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD new file mode 100644 index 0000000..e58677e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD @@ -0,0 +1,11 @@ +contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915 +contextlib2-0.6.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +contextlib2-0.6.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +contextlib2-0.6.0.dist-info/METADATA,sha256=gSVIyF9xprVGAJdZdrVoZR9VXpXRWURqyrugGzj66Rk,2291 +contextlib2-0.6.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +contextlib2-0.6.0.dist-info/top_level.txt,sha256=RxWWBMkHA_rsw1laXJ8L3yE_fyYaBmvt2bVUvj3WbMg,12 +contextlib2-0.6.0.dist-info/RECORD,, +contextlib2-0.6.0.dist-info/__pycache__,, +contextlib2.cpython-38.pyc,, +contextlib2-0.6.0.virtualenv,, +contextlib2-0.6.0.dist-info/INSTALLER,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt new file mode 100644 index 0000000..03fdf8e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt @@ -0,0 +1 @@ +contextlib2 diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv b/.tox/pep8/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/contextlib2.py b/.tox/pep8/lib/python3.8/site-packages/contextlib2.py new file mode 100644 index 0000000..3aae8f4 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/contextlib2.py @@ -0,0 +1,518 @@ +"""contextlib2 - backports and enhancements to the contextlib module""" + +import abc +import sys +import warnings +from collections import deque +from functools import wraps + +__all__ = ["contextmanager", "closing", "nullcontext", + "AbstractContextManager", + "ContextDecorator", "ExitStack", + "redirect_stdout", "redirect_stderr", "suppress"] + +# Backwards compatibility +__all__ += ["ContextStack"] + + +# Backport abc.ABC +if sys.version_info[:2] >= (3, 4): + _abc_ABC = abc.ABC +else: + _abc_ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + +# Backport classic class MRO +def _classic_mro(C, result): + if C in result: + return + result.append(C) + for B in C.__bases__: + _classic_mro(B, result) + return result + + +# Backport _collections_abc._check_methods +def _check_methods(C, *methods): + try: + mro = C.__mro__ + except AttributeError: + mro = tuple(_classic_mro(C, [])) + + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + + +class AbstractContextManager(_abc_ABC): + """An abstract base class for context managers.""" + + def __enter__(self): + """Return `self` upon entering the runtime context.""" + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + """Raise any exception triggered within the runtime context.""" + return None + + @classmethod + def __subclasshook__(cls, C): + """Check whether subclass is considered a subclass of this ABC.""" + if cls is AbstractContextManager: + return _check_methods(C, "__enter__", "__exit__") + return NotImplemented + + +class ContextDecorator(object): + """A base class or mixin that enables context managers to work as decorators.""" + + def refresh_cm(self): + """Returns the context manager used to actually wrap the call to the + decorated function. + + The default implementation just returns *self*. + + Overriding this method allows otherwise one-shot context managers + like _GeneratorContextManager to support use as decorators via + implicit recreation. + + DEPRECATED: refresh_cm was never added to the standard library's + ContextDecorator API + """ + warnings.warn("refresh_cm was never added to the standard library", + DeprecationWarning) + return self._recreate_cm() + + def _recreate_cm(self): + """Return a recreated instance of self. + + Allows an otherwise one-shot context manager like + _GeneratorContextManager to support use as + a decorator via implicit recreation. + + This is a private interface just for _GeneratorContextManager. + See issue #11647 for details. + """ + return self + + def __call__(self, func): + @wraps(func) + def inner(*args, **kwds): + with self._recreate_cm(): + return func(*args, **kwds) + return inner + + +class _GeneratorContextManager(ContextDecorator): + """Helper for @contextmanager decorator.""" + + def __init__(self, func, args, kwds): + self.gen = func(*args, **kwds) + self.func, self.args, self.kwds = func, args, kwds + # Issue 19330: ensure context manager instances have good docstrings + doc = getattr(func, "__doc__", None) + if doc is None: + doc = type(self).__doc__ + self.__doc__ = doc + # Unfortunately, this still doesn't provide good help output when + # inspecting the created context manager instances, since pydoc + # currently bypasses the instance docstring and shows the docstring + # for the class instead. + # See http://bugs.python.org/issue19404 for more details. + + def _recreate_cm(self): + # _GCM instances are one-shot context managers, so the + # CM must be recreated each time a decorated function is + # called + return self.__class__(self.func, self.args, self.kwds) + + def __enter__(self): + try: + return next(self.gen) + except StopIteration: + raise RuntimeError("generator didn't yield") + + def __exit__(self, type, value, traceback): + if type is None: + try: + next(self.gen) + except StopIteration: + return + else: + raise RuntimeError("generator didn't stop") + else: + if value is None: + # Need to force instantiation so we can reliably + # tell if we get the same exception back + value = type() + try: + self.gen.throw(type, value, traceback) + raise RuntimeError("generator didn't stop after throw()") + except StopIteration as exc: + # Suppress StopIteration *unless* it's the same exception that + # was passed to throw(). This prevents a StopIteration + # raised inside the "with" statement from being suppressed. + return exc is not value + except RuntimeError as exc: + # Don't re-raise the passed in exception + if exc is value: + return False + # Likewise, avoid suppressing if a StopIteration exception + # was passed to throw() and later wrapped into a RuntimeError + # (see PEP 479). + if _HAVE_EXCEPTION_CHAINING and exc.__cause__ is value: + return False + raise + except: + # only re-raise if it's *not* the exception that was + # passed to throw(), because __exit__() must not raise + # an exception unless __exit__() itself failed. But throw() + # has to raise the exception to signal propagation, so this + # fixes the impedance mismatch between the throw() protocol + # and the __exit__() protocol. + # + if sys.exc_info()[1] is not value: + raise + + +def contextmanager(func): + """@contextmanager decorator. + + Typical usage: + + @contextmanager + def some_generator(): + + try: + yield + finally: + + + This makes this: + + with some_generator() as : + + + equivalent to this: + + + try: + = + + finally: + + + """ + @wraps(func) + def helper(*args, **kwds): + return _GeneratorContextManager(func, args, kwds) + return helper + + +class closing(object): + """Context to automatically close something at the end of a block. + + Code like this: + + with closing(.open()) as f: + + + is equivalent to this: + + f = .open() + try: + + finally: + f.close() + + """ + def __init__(self, thing): + self.thing = thing + + def __enter__(self): + return self.thing + + def __exit__(self, *exc_info): + self.thing.close() + + +class _RedirectStream(object): + + _stream = None + + def __init__(self, new_target): + self._new_target = new_target + # We use a list of old targets to make this CM re-entrant + self._old_targets = [] + + def __enter__(self): + self._old_targets.append(getattr(sys, self._stream)) + setattr(sys, self._stream, self._new_target) + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + setattr(sys, self._stream, self._old_targets.pop()) + + +class redirect_stdout(_RedirectStream): + """Context manager for temporarily redirecting stdout to another file. + + # How to send help() to stderr + with redirect_stdout(sys.stderr): + help(dir) + + # How to write help() to a file + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + """ + + _stream = "stdout" + + +class redirect_stderr(_RedirectStream): + """Context manager for temporarily redirecting stderr to another file.""" + + _stream = "stderr" + + +class suppress(object): + """Context manager to suppress specified exceptions + + After the exception is suppressed, execution proceeds with the next + statement following the with statement. + + with suppress(FileNotFoundError): + os.remove(somefile) + # Execution still resumes here if the file was already removed + """ + + def __init__(self, *exceptions): + self._exceptions = exceptions + + def __enter__(self): + pass + + def __exit__(self, exctype, excinst, exctb): + # Unlike isinstance and issubclass, CPython exception handling + # currently only looks at the concrete type hierarchy (ignoring + # the instance and subclass checking hooks). While Guido considers + # that a bug rather than a feature, it's a fairly hard one to fix + # due to various internal implementation details. suppress provides + # the simpler issubclass based semantics, rather than trying to + # exactly reproduce the limitations of the CPython interpreter. + # + # See http://bugs.python.org/issue12029 for more details + return exctype is not None and issubclass(exctype, self._exceptions) + + +# Context manipulation is Python 3 only +_HAVE_EXCEPTION_CHAINING = sys.version_info[0] >= 3 +if _HAVE_EXCEPTION_CHAINING: + def _make_context_fixer(frame_exc): + def _fix_exception_context(new_exc, old_exc): + # Context may not be correct, so find the end of the chain + while 1: + exc_context = new_exc.__context__ + if exc_context is old_exc: + # Context is already set correctly (see issue 20317) + return + if exc_context is None or exc_context is frame_exc: + break + new_exc = exc_context + # Change the end of the chain to point to the exception + # we expect it to reference + new_exc.__context__ = old_exc + return _fix_exception_context + + def _reraise_with_existing_context(exc_details): + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise +else: + # No exception context in Python 2 + def _make_context_fixer(frame_exc): + return lambda new_exc, old_exc: None + + # Use 3 argument raise in Python 2, + # but use exec to avoid SyntaxError in Python 3 + def _reraise_with_existing_context(exc_details): + exc_type, exc_value, exc_tb = exc_details + exec("raise exc_type, exc_value, exc_tb") + +# Handle old-style classes if they exist +try: + from types import InstanceType +except ImportError: + # Python 3 doesn't have old-style classes + _get_type = type +else: + # Need to handle old-style context managers on Python 2 + def _get_type(obj): + obj_type = type(obj) + if obj_type is InstanceType: + return obj.__class__ # Old-style class + return obj_type # New-style class + + +# Inspired by discussions on http://bugs.python.org/issue13585 +class ExitStack(object): + """Context manager for dynamic management of a stack of exit callbacks + + For example: + + with ExitStack() as stack: + files = [stack.enter_context(open(fname)) for fname in filenames] + # All opened files will automatically be closed at the end of + # the with statement, even if attempts to open files later + # in the list raise an exception + + """ + def __init__(self): + self._exit_callbacks = deque() + + def pop_all(self): + """Preserve the context stack by transferring it to a new instance""" + new_stack = type(self)() + new_stack._exit_callbacks = self._exit_callbacks + self._exit_callbacks = deque() + return new_stack + + def _push_cm_exit(self, cm, cm_exit): + """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): + return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm + self.push(_exit_wrapper) + + def push(self, exit): + """Registers a callback with the standard __exit__ method signature + + Can suppress exceptions the same way __exit__ methods can. + + Also accepts any object with an __exit__ method (registering a call + to the method instead of the object itself) + """ + # We use an unbound method rather than a bound method to follow + # the standard lookup behaviour for special methods + _cb_type = _get_type(exit) + try: + exit_method = _cb_type.__exit__ + except AttributeError: + # Not a context manager, so assume its a callable + self._exit_callbacks.append(exit) + else: + self._push_cm_exit(exit, exit_method) + return exit # Allow use as a decorator + + def callback(self, callback, *args, **kwds): + """Registers an arbitrary callback and arguments. + + Cannot suppress exceptions. + """ + def _exit_wrapper(exc_type, exc, tb): + callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but + # setting __wrapped__ may still help with introspection + _exit_wrapper.__wrapped__ = callback + self.push(_exit_wrapper) + return callback # Allow use as a decorator + + def enter_context(self, cm): + """Enters the supplied context manager + + If successful, also pushes its __exit__ method as a callback and + returns the result of the __enter__ method. + """ + # We look up the special methods on the type to match the with statement + _cm_type = _get_type(cm) + _exit = _cm_type.__exit__ + result = _cm_type.__enter__(cm) + self._push_cm_exit(cm, _exit) + return result + + def close(self): + """Immediately unwind the context stack""" + self.__exit__(None, None, None) + + def __enter__(self): + return self + + def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + + # We manipulate the exception state so it behaves as though + # we were actually nesting multiple with statements + frame_exc = sys.exc_info()[1] + _fix_exception_context = _make_context_fixer(frame_exc) + + # Callbacks are invoked in LIFO order to match the behaviour of + # nested context managers + suppressed_exc = False + pending_raise = False + while self._exit_callbacks: + cb = self._exit_callbacks.pop() + try: + if cb(*exc_details): + suppressed_exc = True + pending_raise = False + exc_details = (None, None, None) + except: + new_exc_details = sys.exc_info() + # simulate the stack of exceptions by setting the context + _fix_exception_context(new_exc_details[1], exc_details[1]) + pending_raise = True + exc_details = new_exc_details + if pending_raise: + _reraise_with_existing_context(exc_details) + return received_exc and suppressed_exc + + +# Preserve backwards compatibility +class ContextStack(ExitStack): + """Backwards compatibility alias for ExitStack""" + + def __init__(self): + warnings.warn("ContextStack has been renamed to ExitStack", + DeprecationWarning) + super(ContextStack, self).__init__() + + def register_exit(self, callback): + return self.push(callback) + + def register(self, callback, *args, **kwds): + return self.callback(callback, *args, **kwds) + + def preserve(self): + return self.pop_all() + + +class nullcontext(AbstractContextManager): + """Context manager that does no additional processing. + Used as a stand-in for a normal context manager, when a particular + block of code is only sometimes used with a normal context manager: + cm = optional_cm if condition else nullcontext() + with cm: + # Perform operation, using optional_cm if condition is True + """ + + def __init__(self, enter_result=None): + self.enter_result = enter_result + + def __enter__(self): + return self.enter_result + + def __exit__(self, *excinfo): + pass diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA new file mode 100644 index 0000000..7905cc9 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA @@ -0,0 +1,31 @@ +Metadata-Version: 2.1 +Name: distlib +Version: 0.3.0 +Summary: Distribution utilities +Home-page: https://bitbucket.org/pypa/distlib +Author: Vinay Sajip +Author-email: vinay_sajip@red-dove.com +License: Python license +Download-URL: https://bitbucket.org/pypa/distlib/downloads/distlib-0.3.0.zip +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Topic :: Software Development + +Low-level components of distutils2/packaging, augmented with higher-level APIs for making packaging easier. + + diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD new file mode 100644 index 0000000..e5d075a --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD @@ -0,0 +1,48 @@ +distlib/__init__.py,sha256=gzl1hjUXmDGrqRyU7ZLjBwJGAcMimQbrZ22XPVaKaRE,581 +distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +distlib/database.py,sha256=fhNzEDtb4HXrpxKyQvhVzDXcOiJlzrOM--UYnvCeZrI,51045 +distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066 +distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100 +distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +distlib/metadata.py,sha256=OhbCKmf5lswE8unWBopI1hj7tRpHp4ZbFvU4d6aAEMM,40234 +distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +distlib/scripts.py,sha256=OAkEwxRvIzX-VSfhEttQEKJFVLA47gbW0OgQXJRs7OQ,16998 +distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845 +distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +distlib/wheel.py,sha256=bRtR5bNR_u_DwkwktN1bgZuwLVOJT1p_vNIUPyN8kJc,40452 +distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +distlib-0.3.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +distlib-0.3.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +distlib-0.3.0.dist-info/METADATA,sha256=K-1KbKXfYWPNkxh639g8H_epsxZqI8SOWXsMxZfD3j4,1251 +distlib-0.3.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +distlib-0.3.0.dist-info/top_level.txt,sha256=9BERqitu_vzyeyILOcGzX9YyA2AB_xlC4-81V6xoizk,8 +distlib-0.3.0.dist-info/RECORD,, +distlib/compat.cpython-38.pyc,, +distlib/_backport/sysconfig.cpython-38.pyc,, +distlib/_backport/tarfile.cpython-38.pyc,, +distlib/_backport/shutil.cpython-38.pyc,, +distlib-0.3.0.dist-info/INSTALLER,, +distlib/metadata.cpython-38.pyc,, +distlib-0.3.0.virtualenv,, +distlib/_backport/misc.cpython-38.pyc,, +distlib/util.cpython-38.pyc,, +distlib/markers.cpython-38.pyc,, +distlib/_backport/__init__.cpython-38.pyc,, +distlib/database.cpython-38.pyc,, +distlib/resources.cpython-38.pyc,, +distlib/scripts.cpython-38.pyc,, +distlib/manifest.cpython-38.pyc,, +distlib-0.3.0.dist-info/__pycache__,, +distlib/__init__.cpython-38.pyc,, +distlib/_backport/__pycache__,, +distlib/index.cpython-38.pyc,, +distlib/wheel.cpython-38.pyc,, +distlib/locators.cpython-38.pyc,, +distlib/version.cpython-38.pyc,, +distlib/__pycache__,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt new file mode 100644 index 0000000..f68bb07 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distlib diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.virtualenv b/.tox/pep8/lib/python3.8/site-packages/distlib-0.3.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/__init__.py b/.tox/pep8/lib/python3.8/site-packages/distlib/__init__.py new file mode 100644 index 0000000..e19aebd --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2019 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.0' + +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/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07832006b44fe4c835af1b0b2816ce4f8bc69e2f GIT binary patch literal 1064 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52547a7b58a60df163b9b202803c766ec323ffc6 GIT binary patch literal 11014 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc b/.tox/pep8/lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fe58bf51e2c3d65993143a5f39478bab20d3302 GIT binary patch literal 10879 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 ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((? y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/metadata.py b/.tox/pep8/lib/python3.8/site-packages/distlib/metadata.py new file mode 100644 index 0000000..2d61378 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/metadata.py @@ -0,0 +1,1096 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/resources.py b/.tox/pep8/lib/python3.8/site-packages/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/scripts.py b/.tox/pep8/lib/python3.8/site-packages/distlib/scripts.py new file mode 100644 index 0000000..5185974 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/scripts.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version_info[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s.%s' % (name, sys.version_info[0], + sys.version_info[1])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/util.py b/.tox/pep8/lib/python3.8/site-packages/distlib/util.py new file mode 100644 index 0000000..01324ea --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/util.py @@ -0,0 +1,1761 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/version.py b/.tox/pep8/lib/python3.8/site-packages/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/wheel.py b/.tox/pep8/lib/python3.8/site-packages/distlib/wheel.py new file mode 100644 index 0000000..bd17938 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/wheel.py @@ -0,0 +1,1004 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA new file mode 100644 index 0000000..b34cf62 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA @@ -0,0 +1,170 @@ +Metadata-Version: 2.1 +Name: distro +Version: 1.4.0 +Summary: Distro - an OS platform information API +Home-page: https://github.com/nir0s/distro +Author: Nir Cohen +Author-email: nir36g@gmail.com +License: Apache License, Version 2.0 +Platform: All +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: POSIX :: BSD +Classifier: Operating System :: POSIX :: BSD :: FreeBSD +Classifier: Operating System :: POSIX :: BSD :: NetBSD +Classifier: Operating System :: POSIX :: BSD :: OpenBSD +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Operating System +Description-Content-Type: text/markdown + +Distro - an OS platform information API +======================================= + +[![Build Status](https://travis-ci.org/nir0s/distro.svg?branch=master)](https://travis-ci.org/nir0s/distro) +[![Build status](https://ci.appveyor.com/api/projects/status/e812qjk1gf0f74r5/branch/master?svg=true)](https://ci.appveyor.com/project/nir0s/distro/branch/master) +[![PyPI version](http://img.shields.io/pypi/v/distro.svg)](https://pypi.python.org/pypi/distro) +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/distro.svg)](https://img.shields.io/pypi/pyversions/distro.svg) +[![Requirements Status](https://requires.io/github/nir0s/distro/requirements.svg?branch=master)](https://requires.io/github/nir0s/distro/requirements/?branch=master) +[![Code Coverage](https://codecov.io/github/nir0s/distro/coverage.svg?branch=master)](https://codecov.io/github/nir0s/distro?branch=master) +[![Code Quality](https://landscape.io/github/nir0s/distro/master/landscape.svg?style=flat)](https://landscape.io/github/nir0s/distro) +[![Is Wheel](https://img.shields.io/pypi/wheel/distro.svg?style=flat)](https://pypi.python.org/pypi/distro) +[![Latest Github Release](https://readthedocs.org/projects/distro/badge/?version=stable)](http://distro.readthedocs.io/en/latest/) +[![Join the chat at https://gitter.im/nir0s/distro](https://badges.gitter.im/nir0s/distro.svg)](https://gitter.im/nir0s/distro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +`distro` provides information about the +OS distribution it runs on, such as a reliable machine-readable ID, or +version information. + +It is the recommended replacement for Python's original +[`platform.linux_distribution`](https://docs.python.org/3.7/library/platform.html#platform.linux_distribution) +function (which will be removed in Python 3.8). +It also provides much more functionality which isn't necessarily Python bound, +like a command-line interface. + +Distro currently supports Linux and BSD based systems but [Windows and OS X support](https://github.com/nir0s/distro/issues/177) is also planned. + +For Python 2.6 support, see https://github.com/nir0s/distro/tree/python2.6-support + +## Installation + +Installation of the latest released version from PyPI: + +```shell +pip install distro +``` + +Installation of the latest development version: + +```shell +pip install https://github.com/nir0s/distro/archive/master.tar.gz +``` + + +## Usage + +```bash +$ distro +Name: Antergos Linux +Version: 2015.10 (ISO-Rolling) +Codename: ISO-Rolling + +$ distro -j +{ + "codename": "ISO-Rolling", + "id": "antergos", + "like": "arch", + "version": "16.9", + "version_parts": { + "build_number": "", + "major": "16", + "minor": "9" + } +} + + +$ python +>>> import distro +>>> distro.linux_distribution(full_distribution_name=False) +('centos', '7.1.1503', 'Core') +``` + + +## Documentation + +On top of the aforementioned API, several more functions are available. For a complete description of the +API, see the [latest API documentation](http://distro.readthedocs.org/en/latest/). + +## Background + +An alternative implementation became necessary because Python 3.5 deprecated +this function, and Python 3.8 will remove it altogether. +Its predecessor function `platform.dist` was already deprecated since +Python 2.6 and will also be removed in Python 3.8. +Still, there are many cases in which access to that information is needed. +See [Python issue 1322](https://bugs.python.org/issue1322) for more +information. + +The `distro` package implements a robust and inclusive way of retrieving the +information about a distribution based on new standards and old methods, +namely from these data sources (from high to low precedence): + +* The os-release file `/etc/os-release`, if present. +* The output of the `lsb_release` command, if available. +* The distro release file (`/etc/*(-|_)(release|version)`), if present. +* The `uname` command for BSD based distrubtions. + + +## Python and Distribution Support + +`distro` is supported and tested on Python 2.7, 3.4+ and PyPy and on +any distribution that provides one or more of the data sources +covered. + +This package is tested with test data that mimics the exact behavior of the data sources of [a number of Linux distributions](https://github.com/nir0s/distro/tree/master/tests/resources/distros). + + +## Testing + +```shell +git clone git@github.com:nir0s/distro.git +cd distro +pip install tox +tox +``` + + +## Contributions + +Pull requests are always welcome to deal with specific distributions or just +for general merriment. + +See [CONTRIBUTIONS](https://github.com/nir0s/distro/blob/master/CONTRIBUTING.md) for contribution info. + +Reference implementations for supporting additional distributions and file +formats can be found here: + +* https://github.com/saltstack/salt/blob/develop/salt/grains/core.py#L1172 +* https://github.com/chef/ohai/blob/master/lib/ohai/plugins/linux/platform.rb +* https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/facts/system/distribution.py +* https://github.com/puppetlabs/facter/blob/master/lib/src/facts/linux/os_linux.cc + +## Package manager distributions + +* https://src.fedoraproject.org/rpms/python-distro +* https://www.archlinux.org/packages/community/any/python-distro/ +* https://launchpad.net/ubuntu/+source/python-distro +* https://packages.debian.org/sid/python-distro +* https://packages.gentoo.org/packages/dev-python/distro +* https://pkgs.org/download/python2-distro +* https://slackbuilds.org/repository/14.2/python/python-distro/ + + diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD new file mode 100644 index 0000000..72041c5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD @@ -0,0 +1,15 @@ +distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +distro-1.4.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +distro-1.4.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +distro-1.4.0.dist-info/METADATA,sha256=7u13dPkDA9zu5ahg3Ns-H2vfMpR6gBBS55EaBzlXIeg,6648 +distro-1.4.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +distro-1.4.0.dist-info/entry_points.txt,sha256=mDMyvS_AzB0WhRYe_6xrRkAAET1LwFiDTL5Sx57UFiY,40 +distro-1.4.0.dist-info/top_level.txt,sha256=ikde_V_XEdSBqaGd5tEriN_wzYHLgTX_zVtlsGLHvwQ,7 +distro-1.4.0.dist-info/RECORD,, +distro.cpython-38.pyc,, +../../../bin/distro,, +distro-1.4.0.dist-info/__pycache__,, +distro-1.4.0.dist-info/INSTALLER,, +../../../bin/distro3,, +distro-1.4.0.virtualenv,, +../../../bin/distro-3.8,, \ No newline at end of file diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt new file mode 100644 index 0000000..dd40239 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +distro = distro:main + diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..0e09331 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distro diff --git a/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.virtualenv b/.tox/pep8/lib/python3.8/site-packages/distro-1.4.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/.tox/pep8/lib/python3.8/site-packages/distro.py b/.tox/pep8/lib/python3.8/site-packages/distro.py new file mode 100644 index 0000000..3306163 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distro.py @@ -0,0 +1,1216 @@ +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 will remove it altogether. +Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and will also be removed in Python 3.8. +Still, there are many cases in which access to OS distribution information +is needed. See `Python issue 1322 `_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Enterprise Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/.tox/pep8/lib/python3.8/site-packages/easy_install.py b/.tox/pep8/lib/python3.8/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/.tox/pep8/lib/python3.8/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/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA new file mode 100644 index 0000000..a9b0bba --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA @@ -0,0 +1,526 @@ +Metadata-Version: 2.1 +Name: html5lib +Version: 1.0.1 +Summary: HTML parser based on the WHATWG HTML specification +Home-page: https://github.com/html5lib/html5lib-python +Maintainer: James Graham +Maintainer-email: james@hoppipolla.co.uk +License: MIT License +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +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 :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Provides-Extra: all +Requires-Dist: chardet (>=2.2) ; extra == 'all' +Requires-Dist: genshi ; extra == 'all' +Requires-Dist: datrie ; (platform_python_implementation == 'CPython') and extra == 'all' +Requires-Dist: lxml ; (platform_python_implementation == 'CPython') and extra == 'all' +Provides-Extra: chardet +Requires-Dist: chardet (>=2.2) ; extra == 'chardet' +Provides-Extra: datrie +Requires-Dist: datrie ; (platform_python_implementation == 'CPython') and extra == 'datrie' +Provides-Extra: genshi +Requires-Dist: genshi ; extra == 'genshi' +Provides-Extra: lxml +Requires-Dist: lxml ; (platform_python_implementation == 'CPython') and extra == 'lxml' + +html5lib +======== + +.. image:: https://travis-ci.org/html5lib/html5lib-python.png?branch=master + :target: https://travis-ci.org/html5lib/html5lib-python + +html5lib is a pure-python library for parsing HTML. It is designed to +conform to the WHATWG HTML specification, as is implemented by all major +web browsers. + + +Usage +----- + +Simple usage follows this pattern: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + document = html5lib.parse(f) + +or: + +.. code-block:: python + + import html5lib + document = html5lib.parse("

Hello World!") + +By default, the ``document`` will be an ``xml.etree`` element instance. +Whenever possible, html5lib chooses the accelerated ``ElementTree`` +implementation (i.e. ``xml.etree.cElementTree`` on Python 2.x). + +Two other tree types are supported: ``xml.dom.minidom`` and +``lxml.etree``. To use an alternative format, specify the name of +a treebuilder: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + lxml_etree_document = html5lib.parse(f, treebuilder="lxml") + +When using with ``urllib2`` (Python 2), the charset from HTTP should be +pass into html5lib as follows: + +.. code-block:: python + + from contextlib import closing + from urllib2 import urlopen + import html5lib + + with closing(urlopen("http://example.com/")) as f: + document = html5lib.parse(f, transport_encoding=f.info().getparam("charset")) + +When using with ``urllib.request`` (Python 3), the charset from HTTP +should be pass into html5lib as follows: + +.. code-block:: python + + from urllib.request import urlopen + import html5lib + + with urlopen("http://example.com/") as f: + document = html5lib.parse(f, transport_encoding=f.info().get_content_charset()) + +To have more control over the parser, create a parser object explicitly. +For instance, to make the parser raise exceptions on parse errors, use: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + parser = html5lib.HTMLParser(strict=True) + document = parser.parse(f) + +When you're instantiating parser objects explicitly, pass a treebuilder +class as the ``tree`` keyword argument to use an alternative document +format: + +.. code-block:: python + + import html5lib + parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom")) + minidom_document = parser.parse("

Hello World!") + +More documentation is available at https://html5lib.readthedocs.io/. + + +Installation +------------ + +html5lib works on CPython 2.7+, CPython 3.3+ and PyPy. To install it, +use: + +.. code-block:: bash + + $ pip install html5lib + + +Optional Dependencies +--------------------- + +The following third-party libraries may be used for additional +functionality: + +- ``datrie`` can be used under CPython to improve parsing performance + (though in almost all cases the improvement is marginal); + +- ``lxml`` is supported as a tree format (for both building and + walking) under CPython (but *not* PyPy where it is known to cause + segfaults); + +- ``genshi`` has a treewalker (but not builder); and + +- ``chardet`` can be used as a fallback when character encoding cannot + be determined. + + +Bugs +---- + +Please report any bugs on the `issue tracker +`_. + + +Tests +----- + +Unit tests require the ``pytest`` and ``mock`` libraries and can be +run using the ``py.test`` command in the root directory. + +Test data are contained in a separate `html5lib-tests +`_ repository and included +as a submodule, thus for git checkouts they must be initialized:: + + $ git submodule init + $ git submodule update + +If you have all compatible Python implementations available on your +system, you can run tests on all of them using the ``tox`` utility, +which can be found on PyPI. + + +Questions? +---------- + +There's a mailing list available for support on Google Groups, +`html5lib-discuss `_, +though you may get a quicker response asking on IRC in `#whatwg on +irc.freenode.net `_. + +Change Log +---------- + +1.0.1 +~~~~~ + +Released on December 7, 2017 + +Breaking changes: + +* Drop support for Python 2.6. (#330) (Thank you, Hugo, Will Kahn-Greene!) +* Remove ``utils/spider.py`` (#353) (Thank you, Jon Dufresne!) + +Features: + +* Improve documentation. (#300, #307) (Thank you, Jon Dufresne, Tom Most, + Will Kahn-Greene!) +* Add iframe seamless boolean attribute. (Thank you, Ritwik Gupta!) +* Add itemscope as a boolean attribute. (#194) (Thank you, Jonathan Vanasco!) +* Support Python 3.6. (#333) (Thank you, Jon Dufresne!) +* Add CI support for Windows using AppVeyor. (Thank you, John Vandenberg!) +* Improve testing and CI and add code coverage (#323, #334), (Thank you, Jon + Dufresne, John Vandenberg, Geoffrey Sneddon, Will Kahn-Greene!) +* Semver-compliant version number. + +Bug fixes: + +* Add support for setuptools < 18.5 to support environment markers. (Thank you, + John Vandenberg!) +* Add explicit dependency for six >= 1.9. (Thank you, Eric Amorde!) +* Fix regexes to work with Python 3.7 regex adjustments. (#318, #379) (Thank + you, Benedikt Morbach, Ville Skyttä, Mark Vasilkov!) +* Fix alphabeticalattributes filter namespace bug. (#324) (Thank you, Will + Kahn-Greene!) +* Include license file in generated wheel package. (#350) (Thank you, Jon + Dufresne!) +* Fix annotation-xml typo. (#339) (Thank you, Will Kahn-Greene!) +* Allow uppercase hex chararcters in CSS colour check. (#377) (Thank you, + Komal Dembla, Hugo!) + + +1.0 +~~~ + +Released and unreleased on December 7, 2017. Badly packaged release. + + +0.999999999/1.0b10 +~~~~~~~~~~~~~~~~~~ + +Released on July 15, 2016 + +* Fix attribute order going to the tree builder to be document order + instead of reverse document order(!). + + +0.99999999/1.0b9 +~~~~~~~~~~~~~~~~ + +Released on July 14, 2016 + +* **Added ordereddict as a mandatory dependency on Python 2.6.** + +* Added ``lxml``, ``genshi``, ``datrie``, ``charade``, and ``all`` + extras that will do the right thing based on the specific + interpreter implementation. + +* Now requires the ``mock`` package for the testsuite. + +* Cease supporting DATrie under PyPy. + +* **Remove PullDOM support, as this hasn't ever been properly + tested, doesn't entirely work, and as far as I can tell is + completely unused by anyone.** + +* Move testsuite to ``py.test``. + +* **Fix #124: move to webencodings for decoding the input byte stream; + this makes html5lib compliant with the Encoding Standard, and + introduces a required dependency on webencodings.** + +* **Cease supporting Python 3.2 (in both CPython and PyPy forms).** + +* **Fix comments containing double-dash with lxml 3.5 and above.** + +* **Use scripting disabled by default (as we don't implement + scripting).** + +* **Fix #11, avoiding the XSS bug potentially caused by serializer + allowing attribute values to be escaped out of in old browser versions, + changing the quote_attr_values option on serializer to take one of + three values, "always" (the old True value), "legacy" (the new option, + and the new default), and "spec" (the old False value, and the old + default).** + +* **Fix #72 by rewriting the sanitizer to apply only to treewalkers + (instead of the tokenizer); as such, this will require amending all + callers of it to use it via the treewalker API.** + +* **Drop support of charade, now that chardet is supported once more.** + +* **Replace the charset keyword argument on parse and related methods + with a set of keyword arguments: override_encoding, transport_encoding, + same_origin_parent_encoding, likely_encoding, and default_encoding.** + +* **Move filters._base, treebuilder._base, and treewalkers._base to .base + to clarify their status as public.** + +* **Get rid of the sanitizer package. Merge sanitizer.sanitize into the + sanitizer.htmlsanitizer module and move that to sanitizer. This means + anyone who used sanitizer.sanitize or sanitizer.HTMLSanitizer needs no + code changes.** + +* **Rename treewalkers.lxmletree to .etree_lxml and + treewalkers.genshistream to .genshi to have a consistent API.** + +* Move a whole load of stuff (inputstream, ihatexml, trie, tokenizer, + utils) to be underscore prefixed to clarify their status as private. + + +0.9999999/1.0b8 +~~~~~~~~~~~~~~~ + +Released on September 10, 2015 + +* Fix #195: fix the sanitizer to drop broken URLs (it threw an + exception between 0.9999 and 0.999999). + + +0.999999/1.0b7 +~~~~~~~~~~~~~~ + +Released on July 7, 2015 + +* Fix #189: fix the sanitizer to allow relative URLs again (as it did + prior to 0.9999/1.0b5). + + +0.99999/1.0b6 +~~~~~~~~~~~~~ + +Released on April 30, 2015 + +* Fix #188: fix the sanitizer to not throw an exception when sanitizing + bogus data URLs. + + +0.9999/1.0b5 +~~~~~~~~~~~~ + +Released on April 29, 2015 + +* Fix #153: Sanitizer fails to treat some attributes as URLs. Despite how + this sounds, this has no known security implications. No known version + of IE (5.5 to current), Firefox (3 to current), Safari (6 to current), + Chrome (1 to current), or Opera (12 to current) will run any script + provided in these attributes. + +* Pass error message to the ParseError exception in strict parsing mode. + +* Allow data URIs in the sanitizer, with a whitelist of content-types. + +* Add support for Python implementations that don't support lone + surrogates (read: Jython). Fixes #2. + +* Remove localization of error messages. This functionality was totally + unused (and untested that everything was localizable), so we may as + well follow numerous browsers in not supporting translating technical + strings. + +* Expose treewalkers.pprint as a public API. + +* Add a documentEncoding property to HTML5Parser, fix #121. + + +0.999 +~~~~~ + +Released on December 23, 2013 + +* Fix #127: add work-around for CPython issue #20007: .read(0) on + http.client.HTTPResponse drops the rest of the content. + +* Fix #115: lxml treewalker can now deal with fragments containing, at + their root level, text nodes with non-ASCII characters on Python 2. + + +0.99 +~~~~ + +Released on September 10, 2013 + +* No library changes from 1.0b3; released as 0.99 as pip has changed + behaviour from 1.4 to avoid installing pre-release versions per + PEP 440. + + +1.0b3 +~~~~~ + +Released on July 24, 2013 + +* Removed ``RecursiveTreeWalker`` from ``treewalkers._base``. Any + implementation using it should be moved to + ``NonRecursiveTreeWalker``, as everything bundled with html5lib has + for years. + +* Fix #67 so that ``BufferedStream`` to correctly returns a bytes + object, thereby fixing any case where html5lib is passed a + non-seekable RawIOBase-like object. + + +1.0b2 +~~~~~ + +Released on June 27, 2013 + +* Removed reordering of attributes within the serializer. There is now + an ``alphabetical_attributes`` option which preserves the previous + behaviour through a new filter. This allows attribute order to be + preserved through html5lib if the tree builder preserves order. + +* Removed ``dom2sax`` from DOM treebuilders. It has been replaced by + ``treeadapters.sax.to_sax`` which is generic and supports any + treewalker; it also resolves all known bugs with ``dom2sax``. + +* Fix treewalker assertions on hitting bytes strings on + Python 2. Previous to 1.0b1, treewalkers coped with mixed + bytes/unicode data on Python 2; this reintroduces this prior + behaviour on Python 2. Behaviour is unchanged on Python 3. + + +1.0b1 +~~~~~ + +Released on May 17, 2013 + +* Implementation updated to implement the `HTML specification + `_ as of 5th May + 2013 (`SVN `_ revision r7867). + +* Python 3.2+ supported in a single codebase using the ``six`` library. + +* Removed support for Python 2.5 and older. + +* Removed the deprecated Beautiful Soup 3 treebuilder. + ``beautifulsoup4`` can use ``html5lib`` as a parser instead. Note that + since it doesn't support namespaces, foreign content like SVG and + MathML is parsed incorrectly. + +* Removed ``simpletree`` from the package. The default tree builder is + now ``etree`` (using the ``xml.etree.cElementTree`` implementation if + available, and ``xml.etree.ElementTree`` otherwise). + +* Removed the ``XHTMLSerializer`` as it never actually guaranteed its + output was well-formed XML, and hence provided little of use. + +* Removed default DOM treebuilder, so ``html5lib.treebuilders.dom`` is no + longer supported. ``html5lib.treebuilders.getTreeBuilder("dom")`` will + return the default DOM treebuilder, which uses ``xml.dom.minidom``. + +* Optional heuristic character encoding detection now based on + ``charade`` for Python 2.6 - 3.3 compatibility. + +* Optional ``Genshi`` treewalker support fixed. + +* Many bugfixes, including: + + * #33: null in attribute value breaks XML AttValue; + + * #4: nested, indirect descendant,

%vev}Ubox`takRo!|)IROz#nswm~-RQN#&J5pN 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 literal 0 HcmV?d00001 diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/__init__.py b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/misc.py b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/shutil.py b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.py b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..b470a37 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/sysconfig.py @@ -0,0 +1,786 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + +_PY_VERSION = '%s.%s.%s' % sys.version_info[:3] +_PY_VERSION_SHORT = '%s.%s' % sys.version_info[:2] +_PY_VERSION_SHORT_NO_DOT = '%s%s' % sys.version_info[:2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/tarfile.py b/.tox/pep8/lib/python3.8/site-packages/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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/.tox/pep8/lib/python3.8/site-packages/distlib/compat.py b/.tox/pep8/lib/python3.8/site-packages/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[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/.tox/pep8/lib/python3.8/site-packages/distlib/database.py b/.tox/pep8/lib/python3.8/site-packages/distlib/database.py new file mode 100644 index 0000000..c16c0c8 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/index.py b/.tox/pep8/lib/python3.8/site-packages/distlib/index.py new file mode 100644 index 0000000..7a87cdc --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/locators.py b/.tox/pep8/lib/python3.8/site-packages/distlib/locators.py new file mode 100644 index 0000000..12a1d06 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/distlib/locators.py @@ -0,0 +1,1302 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/.tox/pep8/lib/python3.8/site-packages/distlib/manifest.py b/.tox/pep8/lib/python3.8/site-packages/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/.tox/pep8/lib/python3.8/site-packages/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